我刚刚阅读了一些更有经验的程序员编写的代码,我遇到了以下内容:
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
为 a HashMap
,然后直接初始化put
键值对,而无需创建虚拟的占位符映射或使该字段成为不可变映射。我在这里错过了什么吗?