2016-11-03 6 views
1

В веб-приложении Java у меня есть несколько классов, которые имеют статические методы, для которых требуются определенные учетные данные, хранящиеся в файле свойств.Установить значения свойств файла в параметрах статического блока и контекста

мне было интересно, что предпочтительный метод для извлечения значения в свойствах файла:

  1. Статический блок - Есть static блок в классах, которые читает из свойств файла и устанавливает соответствующие полномочия в качестве класса переменные.
  2. Context Params - считывание из файла свойств в ContextListener и установка значений в контексте контекста.

Преимущество (1) состоит в том, что мне не нужно передавать учетные данные в статические методы каждый раз, когда я их вызываю, что является избыточным.

Недостатком (1) является то, что я читаю один и тот же файл свойств несколько раз.

(Преимущество/недостаток обратная для случая (2))

+0

Почему (1) необходимо, чтобы прочитать файл более одного раза? – Thilo

+0

У меня есть несколько таких файлов ... Думаю, я могу сделать это общедоступной переменной. Это то, что вы предлагаете? – theyuv

+0

Если у вас есть значения конфигурации, которые нужно получить из многих классов в вашем приложении, то да, быстрый способ - предоставить их как публичные геттеры или поля. – Thilo

ответ

0

Статический блок: Блок кода «{}», который работает только один раз, и он запускается в первый раз конструктору или основной() для этого класса (Sun вызывает это «когда инициализируется класс») Reference.

«Я читаю один и тот же файл свойств несколько раз».. Почему и как?

+0

Re: «Почему и как»: потому что у меня есть несколько таких файлов, которые должны использовать значения, которые находятся в файле свойств – theyuv

1

Хотя шаблона Singleton обычно можно избежать, вы можете использовать его здесь, чтобы получить доступ к своим свойствам извне. Кроме того, он будет иметь только непреложное состояние, так что я думаю, что это нормально, чтобы использовать Singleton здесь:

public final class MyProperties { 
    private final Properties properties; 

    private MyProperties(){ 
     properties = new Properties(); 
     properties.load(...); // Load your properties here and maybe do some checks 
    } 

    public static final MyProperties INSTANCE = new MyProperties(); 

    // Or add some fields/getters instead 
    public String getProp(String key){ 
     return properties.getProperty(key); 
    } 
} 

Пожалуйста, обратите внимание, что здесь экземпляр создаются при запуске, но вы можете создать его лениво, когда он первый нужен , Преимущество здесь в том, что вы будете уведомлены при запуске в случае, если файл свойств не найден.

Также вы можете расширить это, чтобы проверить, включены ли какие-то обязательные свойства и в противном случае выдают ошибку и предоставляют некоторые свойства для свойств.

В качестве альтернативы вы можете также просто публичные статические поля, которые инициализируются в статическом инициализаторе подобное:

public final class MyProperties { 
    public static final String USERNAME; 
    // More fields   

    static { 
     // Load your properties here and set the fields accordingly 
    } 

    private MyProperties() {} 
}