Java枚举可变性用例和可能性?

2022-09-04 08:05:17

我不知道我是否是唯一一个知道这一点的人,但是枚举的值不是隐式的最终值,可以修改。

  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

这些值通常在创建实例时初始化(),但是,除了我自己之外,我从未见过任何人使用enum变量的最终关键字,这些关键字应该是不可变的。这不是问题的重点,只是想知道我是否是唯一一个意识到这一点的人。TOTO("TOTO 1")


我想知道的是,是否有任何用例可以创建可变枚举?

我还想知道我们可以用枚举做什么的局限性(好的做法与否)。我还没有测试过,但也许可以用春豆注入一个枚举?至少看起来我们可以注释每个实例(@Deprecated对于example来说工作得很好),以及方法。


答案 1

一个可能的用例是延迟初始化(在首次使用时计算一些字段值,如果它们通常根本不使用),或者一个“正常”的可变单例对象(如注册表等)。

但是,在大多数情况下,枚举对象应该是不可变的,并且它们的字段是最终的。


答案 2

虽然你在这里指出了一个有趣的事实,但就我而言,可变枚举字段没有用例。有很多原因可以解释为什么使用这种语言的“功能”(“bug”?)会是一个坏主意,其中最重要的是可能会让其他开发人员感到困惑。