Как объединить два объекта java.util.Properties?
Я пытаюсь создать объект по умолчанию java.util.Properties
в своем классе, со свойствами по умолчанию, которые он принимает, и позволить разработчику переопределить некоторые из них, указав другой объект java.util.Properties
, но я не мог найти приятного путь для этого.
Предполагаемое использование:
Properties defaultProperties = new Properties();
defaultProperties.put("key1", "value1");
defaultProperties.put("key2", "value2");
Properties otherProperties = new Properties();
otherProperties.put("key2", "value3");
Properties finalProperties = new Properties(defaultProperties);
//
// I'd expect to have something like:
//
// finalProperties.merge(otherProperties);
//
Ответы
Ответ 1
java.util.Properties
реализует интерфейс java.util.Map
, поэтому вы можете просто рассматривать его как таковой и использовать такие методы, как putAll
, чтобы добавить содержимое другого Map
.
Однако, если вы относитесь к нему как к карте, вы должны быть очень осторожны с этим:
new Properties(defaultProperties);
Это часто улавливает людей, потому что это похоже на конструктор копирования, но это не так. Если вы используете этот конструктор, а затем вызываете что-то вроде keySet()
(унаследованное от его суперкласса Hashtable
), вы получите пустой набор, потому что методы Map
Properties
не учитывают значение по умолчанию Properties
, который вы передали в конструктор. Значения по умолчанию распознаются только в том случае, если вы используете методы, определенные самим Properties
, например getProperty
и propertyNames
.
Итак, если вам нужно объединить два объекта Properties, безопаснее это сделать:
Properties merged = new Properties();
merged.putAll(properties1);
merged.putAll(properties2);
Это даст вам более предсказуемые результаты, а не произвольное обозначение одного из них как свойства свойства по умолчанию.
Обычно я бы рекомендовал не рассматривать Properties
как Map
, потому что это было (на мой взгляд) ошибкой реализации с первых дней Java (свойства должны были содержать Hashtable
, а не расширены) это был ленивый дизайн), но анемичный интерфейс, определенный в Properties
сам, не дает нам много вариантов.
Ответ 2
Предполагая, что вы в конце концов захотите прочитать свойства из файла, я бы пошел для загрузки обоих файлов в один и тот же объект свойств, например:
Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("default.properties"));
properties.load(getClass().getResourceAsStream("custom.properties"));
Ответ 3
Ты почти хороша:
Properties defaultProperties = new Properties();
defaultProperties.setProperty("key1", "value1");
defaultProperties.setProperty("key2", "value2");
Properties finalProperties = new Properties(defaultProperties);
finalProperties.setProperty("key2", "value3");
ИЗМЕНИТЬ: заменить put
на setProperty
.
Ответ 4
Да, вы правы, просто вызовите метод putAll, и все готово.
Ответ 5
putAll():
Копирует все сопоставления с указанной карты на эту хеш-таблицу. Эти сопоставления заменят любые сопоставления, которые эта хэш-таблица имела для любого из ключей, находящихся в настоящее время на указанной карте.
Properties merged = new Properties();
merged.putAll(properties1);
merged.putAll(properties2);
Строка 2 не имеет никакого эффекта. Ни одно из свойств первого файла не будет находиться в объединенном объекте свойств.