2015-04-27 37 views
5

Sprawdzone metody Java zalecają odczytywanie właściwości jako stałych. Jak myślisz, jakie jest najlepsze podejście, aby do niego dotrzeć? Moje podejście jest następujące: Klasa konfiguracji do odczytu pliku właściwości tylko jeden raz (wzorzec singletowy) i używa tej klasy do odczytywania właściwości w razie potrzeby jako stałych. I klasa Constants do przechowywania:Stałe i właściwości w java

  • Nazwa właściwości, aby znaleźć je w pliku właściwości (np. App.database.url).
  • Stałe statyczne (te, których nie chcę, aby użytkownik konfigurował np. CONSTANT_URL = "myurl.com").
public final class Configurations { 

private Properties properties = null; 
private static Configurations instance = null; 

/** Private constructor */ 
private Configurations(){ 
    this.properties = new Properties(); 
    try{ 
     properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(Constants.PATH_CONFFILE)); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 

/** Creates the instance is synchronized to avoid multithreads problems */ 
private synchronized static void createInstance() { 
    if (instance == null) { 
     instance = new Configurations(); 
    } 
} 

/** Get the properties instance. Uses singleton pattern */ 
public static Configurations getInstance(){ 
    // Uses singleton pattern to guarantee the creation of only one instance 
    if(instance == null) { 
     createInstance(); 
    } 
    return instance; 
} 

/** Get a property of the property file */ 
public String getProperty(String key){ 
    String result = null; 
    if(key !=null && !key.trim().isEmpty()){ 
     result = this.properties.getProperty(key); 
    } 
    return result; 
} 

/** Override the clone method to ensure the "unique instance" requeriment of this class */ 
public Object clone() throws CloneNotSupportedException { 
    throw new CloneNotSupportedException(); 
}} 

Constant klasa zawiera odniesienia do właściwości i stałych.

public class Constants { 
// Properties (user configurable) 
public static final String DB_URL = "db.url"; 
public static final String DB_DRIVER = "db.driver"; 

// Constants (not user configurable) 
public static final String PATH_CONFFILE = "config/config.properties"; 
public static final int MYCONSTANT_ONE = 1; 
} 

i pliki properties byłoby:

db.url=www.myurl.com 
db.driver=mysql 

Aby odczytać właściwości i stałe byłoby:

// Constants 
int i = Constants.MYCONSTANT_ONE; 
// Properties 
String url = Configurations.getInstance().getProperty(Constants.DB_URL); 

Myślisz, że jest to dobre podejście? Jaki jest Twój sposób na odczyt właściwości i stałych w Javie?

Z góry dziękuję.

Odpowiedz

2

znalazłem lepsze rozwiązanie do homogenizacji kod i ma wszystko jako stałe. W tej samej klasie Konfiguracje i pliku .properties: Ponieważ metoda getInstance() jest statyczna, możliwe jest zainicjowanie stałych w stałych klas.

Klasa zapisać nazwę właściwości w pliku .properties:

public class Properties { 
// Properties (user configurable) 
public static final String DB_URL = "db.url"; 
public static final String DB_DRIVER = "db.driver"; 
} 

A potem Stała klasa będzie:

public class Constants { 
// Properties (user configurable) 
public static final String DB_URL = Configurations.getInstance().getProperty(Properties.DB_URL); 
public static final String DB_DRIVER = Configurations.getInstance().getProperty(Properties.DB_DRIVER); 

// Constants (not user configurable) 
public static final String PATH_CONFFILE = "config/config.properties"; 
public static final int MYCONSTANT_ONE = 1; 
} 

I wreszcie z nich korzystać:

// Constants 
int i = Constants.MYCONSTANT_ONE; 
// Properties 
String url = Constants.DB_URL; 

Myślę, że jest to czyste i eleganckie rozwiązanie, które naprawia stałe i problemy z właściwościami w testach.

+2

Jak skomentował to Fabien, możliwe jest również umieszczenie funkcji 'getProperty' w' getInstance' i zmiana nazwy na nową 'getProperty', aby uniknąć wywołania' getInstance(). GetProperty', ale zostawię to w ten sposób w poście, ponieważ łatwiej jest Rozumiesz. –

2

Myślę, że powinieneś rzucić okiem na Apache Commons Configuration, możesz uznać za przydatne. Możesz zrobić wiele rzeczy, takich jak hierarchia plików konfiguracyjnych, określić wiele źródeł.

Dla stałych wydaje dobre :)

+2

Nie ma za co. Zaproponowałem ci to rozwiązanie, ponieważ wiem, że czasami potrzebujemy rozwiązania, które pozwala uzyskać właściwości z różnych podpór. W przeciwnym razie rozwiązanie, które zaadoptowałeś, wydawało się również dobre. Po prostu ustawiłbym 'getProperty' na' static' i zawarłem w nim 'getInstance', aby uniknąć wywołania metody' getInstance' w metodzie, która musi pobrać właściwość. – Fabien

+1

Dzięki za odpowiedź, jego potężna biblioteka dla JNDI lub XML, ale moim zdaniem dla prostych plików właściwości preferowana jest prostota java.util. Możliwe jest także dodawanie wielu źródeł, ładowanie nowych zasobów i dodawanie za pomocą [Properties.putAll] (http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html#putAll (java.util .Map)), ponieważ java.util.Properties implementuje Mapę. –