4

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変数を返す必要があるのはなぜですか? それがただのコピーなら?


結局のところ、ユーザーがそれを (自分自身の使用のために) 変更したい場合、実際には別の非最終的なコピーを作成することをユーザーに強制していますが、これは意味がありません。

4

2 に答える 2

5

これはオブジェクトを返すのではなくfinal、メソッドをオーバーライド不可として宣言しているだけです。オブジェクトのようなものはありませんfinal。final 変数 (参照またはプリミティブ)、final メソッド、および final クラスのみです。

于 2013-10-24T21:32:53.460 に答える