我只是读了一些更有经验的程序员编写的代码,并且遇到了以下问题:

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)的人不仅可以看到该假设,而且会被提醒以防万一它被打破。

这仅在采取长期观点时才有意义。它降低了维护带来的新问题的风险。我喜欢做这种风格的编程,因为即使在我自己的课上,我也会打破常规。有一天,您可能会进行快速修复,而忘记了最初做出的与正确性相关的假设。您可以将代码锁定得越多越好。

07-24 19:39