より経験豊富なプログラマーによって書かれたコードを読んだところ、次のことに出くわしました。
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
ここで何か不足していますか?