gpt4 book ai didi

java - 为什么要使 private static final Lists/Sets/Maps 不可修改?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:05:29 24 4
gpt4 key购买 nike

我刚刚阅读了一位更有经验的程序员编写的一些代码,我遇到了以下问题:

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);
}

// ...

}

如您所见,这是一个用于格式化日志输出的类。然而,引起我注意的是静态初始化程序 block 中的代码:PREFIXES = Collections.unmodifiableMap(prefixes);

为什么 PREFIXES 制作了一个不可修改的 map ? 它是一个私有(private)常量,因此不存在修改该类之外的数据的风​​险。这样做是为了让常量的不变性具有完整性吗?

就我个人而言,我会直接将 PREFIXES 初始化为 HashMap,然后直接将键值对放入,而不创建虚拟、占位符映射或使该字段成为不可变映射。我在这里遗漏了什么吗?

最佳答案

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

只有从长远来看,这才有意义。它降低了维护过程中出现新问题的风险。我喜欢做这种风格的编程,因为即使在我自己的类(class)中我也倾向于破坏东西。有一天,您可能会进行快速修复,而忘记了最初做出的与正确性相关的假设。代码锁定得越多越好。

关于java - 为什么要使 private static final Lists/Sets/Maps 不可修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com