Joshua BlochはEfficient Java で次のように書いています。
長さが 0 でない配列は常に変更可能であるため、クラスが public static final 配列フィールドや、そのようなフィールドを返すアクセサーを持つことは正しくないことに注意してください。クラスにそのようなフィールドまたはアクセサーがある場合、クライアントは配列の内容を変更できます。これは、セキュリティ ホールのよくある原因です。
// Potential security hole!
public static final Thing[] VALUES = { ... };
多くの IDE がプライベート配列フィールドへの参照を返すアクセサーを生成するため、まさにこの問題が発生することに注意してください。問題を解決するには 2 つの方法があります。public 配列を private にして、public の不変リストを追加できます。
private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES =
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
または、配列をプライベートにして、プライベート配列のコピーを返すパブリック メソッドを追加することもできます。
private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
そして私の質問は:
- わざわざ
final
変数を返す必要があるのはなぜですか? それがただのコピーなら?
結局のところ、ユーザーがそれを (自分自身の使用のために) 変更したい場合、実際には別の非最終的なコピーを作成することをユーザーに強制していますが、これは意味がありません。