当前位置: 首页 > 面试题库 >

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

阳宾实
2023-03-14
问题内容

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

  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注入一个枚举吗?至少看来我们可以注释每个实例(例如@Deprecated可以正常工作)以及方法


问题答案:

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

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



 类似资料:
  • 问题内容: 我正在收到RuntimeException 枚举类型可能无法实例化 我不知道为什么 我想要的是用整数值标识年份,例如我有9,所以其他方法的年份是2006。代码: 问题答案: 您不能像这样实例化枚举。您有2种可能性 2.通过添加可以根据code(integer value)返回枚举的方法,对枚举进行以下更改。例如 然后像这样分配

  • 这个问题可能没有具体说明,但我认为很重要。当您想要解决一个优化问题而又不太熟悉方法时,首先想到的是它。 我可以举一些简单的例子: 获取列表的min元素(非常简单) 列出集合的所有置换 列出集合的所有子集 这些问题都有成熟的解决方法。但也有问题不是很清楚: 列出两个字符串的所有(我指的不是编辑操作中最短的一个) 列出两个序列的所有 列出括号的所有可能性 我不知道用蛮力法解决这些问题。我的问题是: 是

  • 问题内容: 这是我要完成的工作,我有一个包含一些值的枚举的类,我想对该类进行子类化并向该枚举添加更多值。这是一个不好的例子,但是: 因此HexDigits.Digit包含所有十六进制数字。那可能吗? 问题答案: 不,这不可能。最好的办法是使两个枚举实现和接口,然后使用该接口代替枚举。所以:

  • 问题内容: 是否可以在Java枚举中使用,还是需要使用?在我的测试中,它始终有效,但是我不确定是否可以保证。特别是,在枚举上没有方法,因此我不知道是否有可能获得一个枚举,该枚举将返回不同于的值。 例如,这样可以吗: 还是我需要这样写: 问题答案: 仅需2美分:这是Sun发布的Enum.java的代码,并且是JDK的一部分:

  • 问题内容: 我没有真正的运气可以通过使用Google来获得这种比较的简洁答案,我想先问一下,而不是自己进行耗时的评估。 我相当确定使用Enums的switch语句将比if-then-else语句执行得更快,尽管是否存在显着差异是另一个问题。 有人可以帮我一下吗? 感谢大家的快速反应,我会在以后的项目中牢记这一点。 问题答案: 是的,是的,因为一般而言,switch语句的运行速度比if / else

  • 问题内容: Java中以下变量的可访问性有什么区别? 我对最后一个正在做什么最感兴趣。 问题答案: :任何人均可读/写 :对于子类的实例以及在封闭包中可读写 :对于类的任何实例以及内部或外部(包含)实例均是可读写的 :包专用,对于同一包内的所有类均可读写 有关更多详细信息,请参见JLS 编辑:添加了受保护的注释,说明访问是从同一程序包内部授予的,你们是完全正确的。还为添加了评论private。我想