Отфильтрованные свойства в Java - PullRequest
0 голосов
/ 28 июня 2011

У меня есть Java-программа, которая использует несколько файлов .properties.Он выбирает, какой файл свойств использовать, основываясь на параметре (режиме), переданном во время выполнения.например, когда программа работает в режиме : a , она использует файл a.properties , а в режиме: b она использует файл b.properties и т. д.Я хочу объединить все эти файлы свойств в один общий.properties и вместо этого иметь разные пространства имен.Например, в common.properties у меня будет:

a.url = aaa
a.ip = aaa.aaa.aaa.aaa
b.url = bbb
b.ip = bbb.bbb.bbb.bbb

Прямо сейчас я создаю экземпляр объекта свойств в методе main и передаю его другим объектам / методам, которые должны что-то прочитать из свойств.Но теперь, когда я объединил свойства, я должен передать режим: a или b, чтобы они знали, какой набор свойств они должны извлечь.Есть ли лучший способ создать отфильтрованный экземпляр файла свойств в методе main, а затем передать его другому объекту таким образом, чтобы эти объекты не знали о режиме: a или b, и просто запросить объект свойств для URLи ip (не a.url или a.ip)

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Не передавайте объект Properties другим методам / объектам. Это слишком низкий уровень, особенно сейчас, когда вам приходится иметь дело с этим пространством имен. Инкапсулируйте свойства внутри выделенного объекта (назовем его «Конфигурация») и передайте этот объект конфигурации.

public class Configuration {
    private String mode;
    private Properties properties;

    public Configuration(String mode, Properties properties) {
        this.mode = mode;
        this.properties = properties;
    }

    public String get(String key) {
        return properties.getString(mode + "." + key);
    }
}

Вы даже можете извлечь контракт этого объекта Configuration в интерфейс и сделать все объекты зависимыми от этого интерфейса, а не от конкретного класса Configuration, что поможет в

  • изменение стратегии конфигурации позже, если вы хотите (если вы сделали это с самого начала, вам не нужно было бы что-либо менять во всех объектах сейчас)
  • высмеивает конфигурацию в модульных тестах, чтобы заставить ее вернуть то, что вы хотите.
0 голосов
/ 28 июня 2011

Вы можете расширить класс Properties, добавить метод получения и установки для активного пространства имен и переопределить метод get() для добавления активного пространства имен и вызова метода super.get().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...