13

それを知っているのが私だけかどうかはわかりませんが、列挙型の値は暗黙的に最終的なものではなく、変更できます。

  enum EnumTest {
    TOTO("TOTO 1"),
    TATA("TATA 2"),
    ;

    private String str;

    private EnumTest(String str) {
      this.str = str;
    }

    @Override
    public String toString() {
      return str;
    }
  }

  public static void main(String[] args) {
    System.out.println(EnumTest.TATA);
    EnumTest.TATA.str = "newVal";
    System.out.println(EnumTest.TATA);
  }

TATA 2
newVal

これらの値は多くの場合、インスタンスの作成時に初期化されます ( TOTO("TOTO 1")) が、私を除いて、不変であるべき enum 変数に final キーワードを使用している人を見たことがありません。それは質問のポイントではありません。これを知っているのは私だけかどうか疑問に思っています。


私が知りたいのは、変更可能な列挙型を作成するユースケースがあったかどうかです。

また、列挙型でできることの限界も知りたいです (良い習慣かどうか)。私はそれをテストしていませんが、enum に Spring Bean を注入できるのでしょうか? 少なくとも、各インスタンス (たとえば @Deprecated は問題なく機能します) とメソッドに注釈を付けることができるようです。

4

8 に答える 8

11

考えられるユースケースの 1 つは、遅延初期化 (まったく使用されないことが多い場合は、最初に使用されるときにいくつかのフィールド値を計算する)、または「通常の」変更可能なシングルトン オブジェクト (レジストリなど) です。

ただし、ほとんどの場合、enum オブジェクトは不変であり、そのフィールドは final である必要があります。

于 2012-10-22T18:50:37.120 に答える
9

ここで興味深い事実を指摘していますが、私に関する限り、変更可能な列挙型フィールドのユースケースはありません。この言語の「機能」(「バグ」?) を利用することが悪い考えである理由はたくさんありますが、特に他の開発者を混乱させる可能性があります。

于 2012-10-22T16:50:23.247 に答える
2

sで可変フィールドの使用を禁止する理由はありませんenum。を使用してenum、型の値が有限の (既知の) 可能性のセットの 1 つに属していることを示します。これらの値が時間の経過とともに変化するプロパティを持つことができないという意味ではありません。

そのようなシナリオのユースケースを求める人もいます。1 つの例は、エラーを任意の数の定義済みカテゴリ (例: 、、...)のいずれかに分類するenumなどのタイプを使用することです。ErrorCategoryDocumentationErrorSemanticErrorLayoutError

またはErrorCategoriesなどのプロパティがあるとします。これらのプロパティの値は時間の経過とともに変化する可能性があるか、ユーザーが構成できる可能性があると想像できます。requiresInstantInterventionshouldFailBuild

これを実装する方法は他にも (実際にEnumMapsは上記のように) あり、スタイルについてはいつでも議論できますが、私にとっては、そのようなenums の使用自体は間違っていません。enums は Java の参照型であるため、 の動作は、そもそも==変更可能なプロパティがない場合と同じままです。

于 2013-05-16T16:34:59.997 に答える
1

enum インスタンスは、enum クラスの public static final Field です。したがって、変更可能な場合は、別のスレッドでその状態を変更できます。これはあなたが望むものではないかもしれませんし、これを認識していないと問題を引き起こすかもしれません.

于 2015-10-27T07:18:04.907 に答える
-3

What I'd like to know is if there was any usecase to create mutable enums?

The enum constants are not themselves mutable, their fields are mutable.

于 2012-10-22T16:45:59.580 に答える