堅牢性を獲得する章
2.5. 配列フィールド定数
『目的』
定数として用意した配列は書きかえられないようにしましょう。
『Before』
定数はpublic static final宣言だからということでこのように書いてみます。
public static final int[] ARRAY_HOGE = {0, 1, 5, 10};
finalとしているので一見不変に思えるのですが、落とし穴があります。
長さがゼロ「ではない」配列は常に可変なのです。
final修飾子はあくまでも参照を不変にするのであって中身を不変とするわけではありません。
ARRAY_HOGE[0] = 100; /* 以後、書き換えられたまま */ System.out.println ("ARRAY_HOGE[0]=" + ARRAY_HOGE[0]);
定数が書き換えられてしまいます。
出力結果は0ではなく100ですね。
『After』
不変なリストを用意してみます。
/* 不変にした状態で外部に公開 */ public static final List<Integer> ARRAY_HOGE = Collections.unmodifiableList(Arrays.asList(0, 1, 5, 10));
『まとめ』
書き方を改めることで「定数」となります。
final修飾子は参照を不変にするだけで内容までは不変にしてくれません。
-
IS 559680 / ISO27001
認証範囲 本社、芝大門オフィス情報セキュリティ基本方針 -
個人情報保護方針
個人情報の取扱いについて
保有個人データ又は
第三者提供記録に関する
事項の周知について
特定個人情報の取扱いについて -
FS 671851 / ISO9001
認証範囲 本社、芝大門オフィス品質方針