2013-08-29 16 views
5

Mamy pewne dane w pliku właściwości. Te dane są używane w wielu klasach. Tak więc tworzymy obiekt klasy Properties w każdej klasie, a następnie odczytujemy dane za pomocą metody getProperty(). Prowadzi to do powielenia kodu.Jak uniknąć wielokrotnego odczytu pliku właściwości

Czy ktoś może zaproponować najlepsze praktyki, aby tego uniknąć?

Jedną rzeczą, która przyszła mi do głowy to:
Utwórz klasę
mają zmienną publiczną dla każdej właściwości w pliku właściwości w tej klasie
mieć metodę, która przypisuje wartości do każdego nieruchomość
W klasa, w której wartości właściwości są wymagane, utwórz obiekt dla tej klasy i uzyskaj dostęp do zmiennych publicznych. Jednak rzeczy, które mi się nie podobają w tym podejściu, są zmiennymi publicznymi i jeśli w ogóle do pliku właściwości dodana jest nowa właściwość, muszę dodać kod, aby odczytać tę właściwość w klasie.

Każda pomoc jest doceniana.

Dziękujemy!

+1

Jak o 'Singleton' podejście za –

+0

możliwym duplikatu [Dodać Właściwości Java dostępne w całej klasy?] (Http://stackoverflow.com/questions/4750131/make-java-properties-available-across-classes) –

Odpowiedz

0

Można to zrobić przy użyciu specjalnej klasy mającej nieruchomy obiekt właściwości. Zobacz przykład here.

0

mogę być nieporozumienie dane płyną tutaj, ale to jest to, co wydaje się „normalne” do mnie:

  • utworzyć metodę readPropFile.
    • Powinno to odczytać plik i odpowiednio przeanalizować znalezione właściwości.
    • Te właściwości można zapisać w postaci Map<String, Object>, zakodowanej według nazwy właściwości.
  • odczytać pliku właściwość raz (przypuszczalnie po uruchomieniu aplikacji lub gdy jest to stosowne, aby załadować właściwości) ->Properties przedmiot (powiedzmy, props).
  • Przekazać props wokół wszystkiego, co wymaga dostępu do tych właściwości.
    • Jeśli nie chcesz tego wyraźnie przekazywać, użyj statycznego akcesora, jak pokazano na ilustracji here.
  • Właściwości dostępu przy użyciu props.get("PROPERTY_NAME") (które po prostu wyszukuje tę właściwość w wewnętrznym Map).
    • Jeśli nie chcesz korzystać z wyszukiwań String, możesz zachować wyliczenie ważnych nazw właściwości gdzieś i używać ich do przechowywania/wyszukiwania, ale musisz zaktualizować to wyliczenie za każdym razem, gdy dodasz nową właściwość do pliku.
+0

Dzięki, jest to również przydatne – Austin

17

Można utworzyć klasy Singleton, który ładuje właściwości po raz pierwszy zostanie wywołany ..i publiczną metodę, która pobiera wartość właściwości dla danego klucza własności ..

Zakłada się, że używasz standardowego pliku właściwości ... Możesz jednak ekstrapolować to do dowolnej pary klucz-wartość, zmieniając typ właściwości do mapy lub czegoś innego.

Coś

public class PropertyHandler{ 

    private static PropertyHandler instance = null; 

    private Properties props = null; 

    private PropertyHandler(){ 
     // Here you could read the file into props object 
     this.props = ..... 
    } 

    public static synchronized PropertyHandler getInstance(){ 
     if (instance == null) 
      instance = new PropertyHandler(); 
     return instance; 
    } 

    public String getValue(String propKey){ 
     return this.props.getProperty(propKey); 
    } 
} 

Następnie można wywołać tego, ile potrzeba .. z dowolnego kodu .. tak.

String myValue = PropertyHandler.getInstance().getValue(propKey); 

Nadzieja to pomaga

+1

Jeśli PropertyHandler będzie użyty z więcej niż jednego wątku, to getInstance powinno być zsynchronizowane. –

+0

Masz rację ... naprawiono ... (Napisałem to w locie ... Zapomniałem ...) –

+0

tak, to pomogło. Dziękuję Ci bardzo. Ponadto, dzięki wszystkim, którzy odpowiedzieli. – Austin

0

jakie miałem sukces przy użyciu enum, w konstruktorze przy użyciu metody nazwa(), aby odczytać właściwość o tej samej nazwie. Upewnij się, że obsługujesz wyjątki w rozsądny sposób, bo inaczej nie załaduje się cała klasa i nie dostaniesz użytecznego komunikatu o błędzie.

Korzyści z tego podejścia polegają na tym, że każda wartość wyliczeniowa automatycznie odpowiada właściwości, bez konieczności pisania indywidualnego kodu odwzorowania dla każdej właściwości. Oczywiście potrzebujesz wartości wyliczeniowej dla każdej właściwości (jest to nieuniknione, jeśli chcesz mieć referencje do aplikacji DRY), ale unikasz powtarzania kodu inicjalizacji dla każdej właściwości, używając niezaznaczonych Ciągów.

Wady polegają na tym, że przeliczenia nie zezwalają na typy ogólne, więc jeśli chcesz, aby pewne właściwości zwracały Integer i inne, aby zwracać String, możesz lepiej obsłużyć klasyczną klasę singleton.

Jeśli chcesz zwariować z tym, możesz również napisać skrypt generujący kod źródłowy Enum lub singleton java z pliku właściwości, aby Twój kod był jeszcze bardziej suchy.

2

dla mnie statyczna wewnętrzna klasa to najlepszy sposób na zrobienie tego. Zrobi to leniwie, ponieważ ładowanie klasy jest zsynchronizowane, więc bezpieczne dla wątków, a także wydajne. W ten sposób osiągamy trzy rzeczy:

  1. Dobra wydajność, ponieważ zsynchronizowanie żywotności będzie cierpieć, ale tutaj używamy statycznej klasy wewnętrznej.
  2. Bezpieczeństwo wątków, ponieważ gdy zostanie załadowana klasa wewnętrzna, zostanie zainicjowana tylko mapa, ponieważ ładowanie klasy jest bezpieczne dla wątków, dlatego wszystkie wątki są bezpieczne.
  3. Klasa wewnętrzna zostanie załadowana, gdy zadzwonimy pod numer Singleton.initialize().get(key), aby mapa została zainicjowana leniwie.

Poniżej znajduje się kod ...

public class SingletonFactory 
{ 
    private static class Singleton 
    { 
     private static final Map<String, String> map = new HashMap<String, String>(); 
     static 
     { 
      try 
      { 
       //here we can read properties files 
       map.put("KEY", "VALUE"); 
      } 
      catch(Exception e) 
      { 
       //we can do the exception handling 
       System.out.println(e); 
      } 
     } 
     private static Map<String, String> initialize() 
     { 
      return map; 
     } 
    } 

    public static String getValue(String key) 
    { 
     return Singleton.initialize().get(key); 
    } 
} 
Powiązane problemy