Подтвердить что ты не робот

Как объединить два объекта 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);
//
4b9b3361

Ответ 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 не имеет никакого эффекта. Ни одно из свойств первого файла не будет находиться в объединенном объекте свойств.