首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使私有静态最终列表/集/地图不可修改?

为什么使私有静态最终列表/集/地图不可修改?
EN

Stack Overflow用户
提问于 2012-12-10 01:23:41
回答 6查看 6.9K关注 0票数 10

我刚刚读了一些由更有经验的程序员编写的代码,我看到了以下内容:

代码语言:javascript
复制
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中,而不创建虚拟、占位符映射或使字段成为不可变的映射。我是不是漏掉了什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-12-10 03:02:26

通过使列表不可修改,作者记录了他的假设,即这些值永远不会改变。以后可能编辑该类的人不仅可以看到这个假设,而且还会被提醒,以防它被破坏。

这只有在采取长期观点时才有意义。它减少了因维护而产生新问题的风险。我喜欢做这种类型的编程,因为我倾向于在我自己的课程中打破一些东西。有一天,您可能会进行快速修复,而忘记了最初提出的与正确性相关的假设。你越能锁定代码,就越好。

票数 9
EN

Stack Overflow用户

发布于 2012-12-10 02:55:59

如果您意外地从一个方法return PREFIXES,突然之间,任何其他的代码可以修改它。使常量真正不可变,在将来凌晨3点修改该代码时,会防止您自己的愚蠢。

票数 9
EN

Stack Overflow用户

发布于 2012-12-10 01:27:08

有一个可以从类外部修改的private映射、集合或数组是非常容易的。你会把它标记为final,为什么不也说明它应该是不可变的?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13793761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档