6

プライベート参照型のいわゆる「防御コピー」を返す必要があります。これは、プライベート フィールドの参照を返さないようにするためです。

プライベート列挙型に必要かどうかを知りたいです。列挙型は不変の参照型であることをどこかで読んだので、答えは「いいえ」でなければなりません。そうですか?

4

1 に答える 1

14

列挙型は本質的に不変ではありませんが、利用可能なインスタンスの固定セットしかないため、とにかく防御コピーを作成することはできませ。新しいインスタンス。

いずれにせよ、列挙型は一般的に不変であるべきですが、本質的不変であるという主張を打ち消すために:

enum BadEnum {
    INSTANCE;

    private int foo;

    private int getFoo() {
        return foo;
    }

    public int setFoo(int foo) {
        this.foo = foo;
    }
}

class Test {
    public static void main(String[] args) {
        BadEnum.INSTANCE.setFoo(10);
        System.out.println(BadEnum.INSTANCE.getFoo()); // Prints 10
    }
}

要するに:

  • 列挙型を不変にします。変更可能な列挙型を作成したいと思ったことさえ思い出せません。
  • 防御的なコピーを作成しようとすることはできませんし、すべきではありません。
于 2013-09-09T14:04:49.313 に答える