Как объединить два java.утиль.Свойства объектов?
Я пытаюсь иметь значение по умолчанию
5 ответов:
java.util.Propertiesосуществляетjava.util.Mapинтерфейс, и поэтому вы можете просто рассматривайте его как таковой и используйте такие методы, какputAllчтобы добавить содержимое другогоMap.однако, если вы относитесь к нему как к карте, вы должны быть очень осторожны с этим:
new Properties(defaultProperties);это часто ловит людей, потому что это выглядит как конструктор копирования, но это не так. Если вы используете этот конструктор, а затем вызвать что-то вроде
keySet()(по наследству от егоHashtableсуперкласса), вы получите пустой набор, потому чтоMapспособыPropertiesне учитывайте значение по умолчаниюPropertiesобъект, который вы передали в конструктор. Значения по умолчанию распознаются только при использовании методов, определенных в , напримерgetPropertyиpropertyNames, среди других.поэтому, если вам нужно объединить два объекта свойств, безопаснее сделать это:
Properties merged = new Properties(); merged.putAll(properties1); merged.putAll(properties2);это даст вам более предсказуемые результаты, а не произвольно обозначение одного из них как набора свойств" по умолчанию".
обычно, я бы рекомендовал не лечить
PropertiesкакMap, потому что это была (на мой взгляд) ошибка реализации с первых дней Java (свойства должны были содержатьHashtable, не расширил его - это был ленивый дизайн), но анемичный интерфейс, определенный вPropertiesсам по себе не дает нам много вариантов.
предполагая, что вы в конечном итоге хотели бы прочитать свойства из файла, я бы пошел на загрузку обоих файлов в один и тот же объект свойств, например:
Properties properties = new Properties(); properties.load(getClass().getResourceAsStream("default.properties")); properties.load(getClass().getResourceAsStream("custom.properties"));
ты почти хорошо:
Properties defaultProperties = new Properties(); defaultProperties.setProperty("key1", "value1"); defaultProperties.setProperty("key2", "value2"); Properties finalProperties = new Properties(defaultProperties); finalProperties.setProperty("key2", "value3");EDIT: заменить
putbysetProperty.
putAll(): Копирует все сопоставления из указанной карты в эту хэш-таблицу. Эти сопоставления заменят любые сопоставления, которые эта хэш-таблица имела для любого из ключей в настоящее время в указанной карте.
Properties merged = new Properties(); merged.putAll(properties1); merged.putAll(properties2);строка 2 не имеет никакого эффекта вообще. Ни одно из свойств из первого файла не будет находиться в объединенном объекте свойств.