java.util.Properties有一个鲜为人知的特性,可以让你创建这种层次结构而无需编写特殊代码:
package stackoverflow;
import java.util.Properties;
public class Main {
static Properties propsBase;
static Properties propsOverlay;
static Properties propsOverlayOverlay;
public static void main(String[] args) {
propsBase = new Properties();
propsOverlay = new Properties(propsBase);
propsOverlayOverlay = new Properties(propsOverlay);
propsBase.setProperty("key1", "value1");
propsBase.setProperty("key2", "value2");
debugAllProps();
propsOverlay.setProperty("key1", "overlayValue1");
debugAllProps();
propsOverlayOverlay.setProperty("key1", "overlayOverlayValue1");
debugAllProps();
propsOverlayOverlay.remove("key1");
debugAllProps();
propsOverlay.remove("key1");
debugAllProps();
}
private static void debugAllProps() {
printProps("propsBase", propsBase);
printProps("propsOverlay", propsOverlay);
printProps("propsOverlayOverlay", propsOverlayOverlay);
System.out.println("------------------------------------------------");
}
private static void printProps(String desc, Properties props) {
System.out.printf("%-25s", desc + " sees:");
for (String key : props.stringPropertyNames()) {
System.out.printf(" %s=%s", key, props.getProperty(key));
}
System.out.println();
}
}
输出:
propsBase sees: key2=value2 key1=value1
propsOverlay sees: key2=value2 key1=value1
propsOverlayOverlay sees: key2=value2 key1=value1
-------------------------------------------------
propsBase sees: key2=value2 key1=value1
propsOverlay sees: key2=value2 key1=overlayValue1
propsOverlayOverlay sees: key2=value2 key1=overlayValue1
-------------------------------------------------
propsBase sees: key2=value2 key1=value1
propsOverlay sees: key2=value2 key1=overlayValue1
propsOverlayOverlay sees: key2=value2 key1=overlayOverlayValue1
-------------------------------------------------
propsBase sees: key2=value2 key1=value1
propsOverlay sees: key2=value2 key1=overlayValue1
propsOverlayOverlay sees: key2=value2 key1=overlayValue1
-------------------------------------------------
propsBase sees: key2=value2 key1=value1
propsOverlay sees: key2=value2 key1=value1
propsOverlayOverlay sees: key2=value2 key1=value1
这种方法有一些重要的限制:
如果我要做任何严肃的事情,我可能不会使用java.util.Properties
,而是设计自己的集合,以Properties
的一般方法为灵感。你可以通过查看与JDK一起安装的src.zip
来阅读java.util.Properties
的源代码。
我的集合理解是
- 允许对象键和对象值
- 具有允许检查和修改层次结构的方法
- 可能不会对任何现有集合进行子类化 - 主要是为了避免使每个超类方法都“层次感知”。可能更喜欢decorate一个
HashMap
。
- 如果有意义,可能会实现一些
java.util
集合接口
- 可能支持泛型