2013-08-29 2 views
5

У нас есть некоторые данные в файле свойств. Эти данные используются во многих классах. Итак, мы создаем объект класса Properties в каждом классе, а затем читаем данные с использованием метода getProperty(). Это приводит к дублированию кода.Как избежать чтения файла свойств несколько раз

Может кто-нибудь предложить несколько лучших практик, чтобы избежать этого?

Одна вещь, которая пришла мне в голову:
Создать класс
общедоступный переменную для каждого свойства в файле свойств в этом классе
есть метод, который присваивает значения и каждый дом
В класс, где требуются значения свойств, создать объект для этого класса и получить доступ к общедоступным переменным

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

Любая помощь приветствуется.

Спасибо!

+1

Как насчет ' –

+0

возможного дубликата Singleton' подхода о [Сделать Java Свойства доступны по классам?] (Http://stackoverflow.com/questions/4750131/make-java-properties-available-through-classes) –

ответ

0

Один из вариантов использования - system properties. Вы можете добавить свои собственные системные свойства в свою среду исполнения.

0

Вы можете сделать это с помощью выделенного класса со статическим объектом Свойства. См. Пример here.

0

я мог быть недоразумением данных потока здесь, но это то, что кажется «нормальным» для меня:

  • Создать метод readPropFile.
    • Это должно прочитать файл и соответствующим образом проанализировать найденные свойства.
    • Эти свойства могут быть сохранены в файле Map<String, Object>, хэшированном по названию.
  • Чтение свойств файла один раз (предположительно при запуске приложения, или всякий раз, когда это целесообразно загрузить свойства) ->Properties объект (скажем, props).
  • Провод props вокруг всего, что нуждается в доступе к этим объектам.
    • Или, если вы не хотите его явно передавать, используйте статический аксессор, как показано на рисунке here.
  • Свойства доступа с использованием props.get("PROPERTY_NAME") (который просто ищет это свойство во внутреннем Map).
    • Если вы не хотите использовать поиск по строкам, вы можете сохранить перечисление имен допустимых свойств где-нибудь и сделать это с помощью хранения/поиска, но тогда вы должны обновлять это перечисление при каждом добавлении нового свойства к файлу.
+0

Спасибо, это также полезно – Austin

17

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

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

Что-то вроде

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

Затем вы можете вызвать это по мере необходимости .. из любого кода .. как это.

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

Надеется, что это помогает

+1

Если PropertyHandler будет использоваться из более чем одного потока, тогда getInstance должен быть синхронизирован. –

+0

Вы правы ... исправлены ... (я написал это на лету .. я забыл ...) –

+0

да, это помогло. Большое спасибо. Кроме того, спасибо всем, кто ответил. – Austin

0

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

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

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

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

2

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

  1. хорошее качество, потому что с синхронизацией живости будет страдать, но здесь мы используем статический внутренний класс.
  2. безопасность потока, потому что, когда будет загружен внутренний класс, будет инициализирована только карта, так как загрузка класса является потокобезопасной, следовательно, весь поточный сейф.
  3. Внутренний класс будет загружен, когда мы назовем Singleton.initialize().get(key), чтобы карта инициализировалась лениво.

Ниже приведен код ...

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); 
    } 
} 
Смежные вопросы