我刚刚读了一些由更有经验的程序员编写的代码,我看到了以下内容:
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中,而不创建虚拟、占位符映射或使字段成为不可变的映射。我是不是漏掉了什么?
发布于 2012-12-10 03:02:26
通过使列表不可修改,作者记录了他的假设,即这些值永远不会改变。以后可能编辑该类的人不仅可以看到这个假设,而且还会被提醒,以防它被破坏。
这只有在采取长期观点时才有意义。它减少了因维护而产生新问题的风险。我喜欢做这种类型的编程,因为我倾向于在我自己的课程中打破一些东西。有一天,您可能会进行快速修复,而忘记了最初提出的与正确性相关的假设。你越能锁定代码,就越好。
发布于 2012-12-10 02:55:59
如果您意外地从一个方法return PREFIXES,突然之间,任何其他的代码可以修改它。使常量真正不可变,在将来凌晨3点修改该代码时,会防止您自己的愚蠢。
发布于 2012-12-10 01:27:08
有一个可以从类外部修改的private映射、集合或数组是非常容易的。你会把它标记为final,为什么不也说明它应该是不可变的?
https://stackoverflow.com/questions/13793761
复制相似问题