我刚刚阅读了一位更有经验的程序员编写的代码,并发现了以下内容:
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
方法来添加键值对,而不需要创建一个虚拟的占位符映射或使字段成为不可变映射。我错过了什么吗?