Как объединить два java.утиль.Свойства объектов?


Я пытаюсь иметь значение по умолчанию

5 53

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 by setProperty.

Да, вы правы, просто вызовите метод putAll, и все готово.

putAll(): Копирует все сопоставления из указанной карты в эту хэш-таблицу. Эти сопоставления заменят любые сопоставления, которые эта хэш-таблица имела для любого из ключей в настоящее время в указанной карте.

Properties merged = new Properties();
merged.putAll(properties1);
merged.putAll(properties2);

строка 2 не имеет никакого эффекта вообще. Ни одно из свойств из первого файла не будет находиться в объединенном объекте свойств.