2015-04-27 4 views
5

Рекомендации по использованию Java рекомендуют читать свойства как константы. Итак, как вы думаете, лучший подход к его достижению? Мой подход: Класс конфигурации для чтения файла свойств только один раз (singleton pattern) и использовать этот класс для чтения свойств, когда это необходимо в качестве констант. И класс Constants для хранения:Константы и свойства в java

  • Имя свойства, которое можно найти в файле свойств (например, app.database.url).
  • Статические константы (те, которые я не хочу настраивать для пользователя, например 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(); 
}} 

Константа класс содержит ссылки на свойства и константы.

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; 
} 

и свойства файлов будут:

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

Чтобы прочитать свойства и константы будут:

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

Как вы думаете, это хороший подход? Каков ваш путь к чтению свойств и констант в Java?

Заранее спасибо.

ответ

2

Я нашел лучшее решение для гомогенизации коды и имею все как константы. С тем же классом конфигураций и .properties: поскольку метод getInstance() является статическим, можно инициализировать константы в классе Constants.

Класс для хранения имени свойства в .properties:

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

И тогда Constant класса будет:

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; 
} 

И, наконец, использовать их:

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

Я думаю, что это чистое и элегантное решение, которое фиксирует постоянные и свойства проблемы в тестах.

+2

Как Фабьен прокомментировал также возможную возможность поместить функцию 'getProperty' в' getInstance' и переименовать ее как новый 'getProperty', чтобы избежать вызова getInstance(). GetProperty', но я оставляю это таким образом в сообщении, потому что это проще Понимаю. –

2

Я думаю, вы должны взглянуть на Apache Commons Configuration, вам это может пригодиться. Вы можете делать много вещей, например, иметь иерархию для ваших конфигурационных файлов, указывать несколько источников.

Для Константы кажется, хорошо :)

+2

Добро пожаловать. Я предложил вам это решение, потому что знаю, что иногда нам нужно иметь решение, позволяющее получать свойства с разных сторон. В противном случае решение, которое вы приняли, тоже показалось хорошим. Я бы просто установил 'getProperty' как' static' и включил в него 'getInstance', чтобы избежать вызова' getInstance' в методе, который должен получить свойство. – Fabien

+1

Спасибо за ответ, его мощная библиотека для JNDI или XML, но, на мой взгляд, для простых файлов свойств предпочтительнее простота java.util. Также возможно добавить несколько источников, загружающих новые ресурсы, и добавление с помощью [Properties.putAll] (http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html#putAll (java.util .Map)), так как java.util.Properties реализует Map. –

Смежные вопросы