Как объединить два 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: заменить
put
bysetProperty
.
putAll(): Копирует все сопоставления из указанной карты в эту хэш-таблицу. Эти сопоставления заменят любые сопоставления, которые эта хэш-таблица имела для любого из ключей в настоящее время в указанной карте.
Properties merged = new Properties(); merged.putAll(properties1); merged.putAll(properties2);
строка 2 не имеет никакого эффекта вообще. Ни одно из свойств из первого файла не будет находиться в объединенном объекте свойств.