【发布时间】:2012-12-10 01:23:41
【问题描述】:
我刚刚阅读了一些更有经验的程序员编写的代码,我遇到了以下内容:
public class ConsoleFormatter extends Formatter {
private static final Map<Level, String> PREFIXES;
static {
Map<Level, String> prefixes = new HashMap<Level, String>();
prefixes.put(Level.CONFIG, "[config]");
prefixes.put(Level.FINE, "[debug]");
prefixes.put(Level.FINER, "[debug]");
prefixes.put(Level.FINEST, "[trace]");
prefixes.put(Level.INFO, "[info]");
prefixes.put(Level.SEVERE, "[error]");
prefixes.put(Level.WARNING, "[warning]");
PREFIXES = Collections.unmodifiableMap(prefixes);
}
// ...
}
如您所见,这是一个用于格式化日志输出的类。然而,引起我注意的是静态初始化块中的代码:PREFIXES = Collections.unmodifiableMap(prefixes);。
为什么PREFIXES 制作了一张不可修改的地图? 这是一个私有常量,因此不存在修改该类之外的数据的风险。这样做是为了让常量的不变性具有完整性感吗?
就个人而言,我会直接将PREFIXES 初始化为HashMap,然后直接将put 键值对初始化,而无需创建虚拟的占位符映射或使该字段成为不可变映射。我在这里遗漏了什么吗?
【问题讨论】:
-
还可能考虑在实例化类时防止并发初始化问题,因为单步分配给整个数据的 PREFIXES。
标签: java collections map constants immutability