我试图在我的类中有一个默认的 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);
//
最佳答案
java.util.Properties
实现了 java.util.Map
接口(interface),因此您可以将其视为这样,并使用像 putAll
这样的方法来添加另一个 Map
的内容。
但是,如果您将其视为 map ,则需要非常小心:
new Properties(defaultProperties);
这通常会引起人们的注意,因为它看起来像一个复制构造函数,但事实并非如此。如果你使用那个构造函数,然后调用类似 keySet()
的东西(继承自它的 Hashtable
父类(super class)),你会得到一个空集,因为 Map
方法不考虑您传递给构造函数的默认 Properties
的 Properties
对象。仅当您使用 Properties
本身中定义的方法(例如 getProperty
和 propertyNames
等)时,才会识别默认值。
所以如果需要合并两个 Properties 对象,这样做比较安全:
Properties merged = new Properties();
merged.putAll(properties1);
merged.putAll(properties2);
这将为您提供更可预测的结果,而不是随意将其中一个标记为“默认”属性集。
通常,我建议不要将 Properties
视为 Map
,因为(在我看来)这是 Java 早期的一个实现错误(属性应该有包含一个 Hashtable
,而不是对其进行扩展 - 那是惰性设计),但在 Properties
中定义的贫血接口(interface)本身并没有给我们很多选择。
关于java - 如何合并两个 java.util.Properties 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2004833/