我只是读了一些更有经验的程序员编写的代码,并且遇到了以下问题:
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
成为无法修改的 map ? 这是一个私有(private)常量,因此没有在该类外部修改数据的风险。 是否已使常量的不变性具有完整性?就我个人而言,我会直接将
PREFIXES
初始化为HashMap
,然后直接将键值对put
放入,而无需创建虚拟的,占位符映射或使字段成为不可变的映射。我在这里想念什么吗? 最佳答案
通过使列表不可修改,作者记录了他的假设,即值(value)观永远不会改变。以后可以编辑该类(class)的人不仅可以看到该假设,而且会被提醒以防万一它被打破。
这仅在采取长期观点时才有意义。它降低了维护带来的新问题的风险。我喜欢做这种风格的编程,因为即使在我自己的课上,我也会打破常规。有一天,您可能会进行快速修复,而忘记了最初做出的与正确性相关的假设。您可以将代码锁定得越多越好。