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

标签 java spring enums

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

  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")),但是,除了我自己,我从未见过有人将 final 关键字用于本应不可变的枚举变量。这不是问题的重点,只是想知道是否我是唯一知道这一点的人。


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

而且我还想知道我们可以用枚举做什么的限制(好的做法与否)。 我没有测试过,但也许枚举可以用 Spring bean 注入(inject)? 至少看起来我们可以注释每个实例(例如@Deprecated 工作得很好),还有方法。

最佳答案

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

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

关于Java 枚举可变性用例和可能性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13015870/

相关文章:

java - 具有相反方向的枚举

java - Spring Data PostgreSQL Key already exists 错误2

java - 优化 ArrayList.removeAll

java - Retrofit 2通过MS graph api发送邮件返回参数 'Message'的值为空

java - 带有 Freemarker 的 Spring Framework 错误 Controller

Java枚举反向查找

java - JVMVRFY012 堆栈形状不一致;类=com/sun/xml/messaging/saaj/soap/SOAPDocumentImpl

java - XSLT:我们可以使用 abs 值吗?

java - 将字符串 x = "[]"映射到 JsonNode 会导致额外的引号(Spring Boot)

c# - 如何将列表与 C# 中的每个枚举项相关联