在运行时Java中更改枚举

en_*_*ght 3 java enums runtime

有什么方法可以向Java中的内置枚举类添加元素?

我的问题类似于Java能否在运行时添加和删除枚举元素,但该问题似乎旨在构建自己的枚举,然后对其进行修改。我假设存在无法更改的现有枚举,例如

enum Days{ MONDAY, TUESDAY, WEDNESDAY }
Run Code Online (Sandbox Code Playgroud)

我想在此添加星期四,星期五等。因此,不幸的是,关于如何使用接口来实现我的目标的建议,或比枚举更有效的其他方法的建议,在这里不适用。

据我了解,枚举是隐式最终的,因此无法扩展它并向其中添加更多元素。它具有专用字段,但看来我可以使用反射来访问这些字段-即使我不能添加一个新的专用字段,也可以更改一个专用字段,例如,将星期一更改为星期四?

编辑:澄清情况

人们建议在将代码编译到程序中之前先对其进行更改。我的代码是我无法更改的更大项目的一部分;包含枚举的类由较大的程序加载,然后我的类才能访问它。到那时,我想将缺少的元素添加到枚举中。字节码操作仍然是要走的路吗?

sco*_*ttb 5

枚举旨在成为具有常量意义的静态,最终,不变,实例控制的对象。每当项目包含编译时已知的事物的自然分组或列表时,您都应该想到一个枚举。

JVM保证枚举在运行时是实例控制的并且是不变的。还保证了枚举的二进制兼容性,因此,如果以后添加枚举常量,则程序将继续运行。

简短的答案是:“不,没有简单的方法可以在Java中扩展枚举类。”

一种替代方法是让基本枚举实现接口,该接口用作枚举常量的基本类型。

然后可以通过创建实现该接口的新枚举来“扩展”枚举。即使这样,从设计上讲,这也不是运行时要发生的。


Pet*_*rey 0

您可以在运行时更改枚举,方法是在加载类之前在运行时更改该类。您可以在运行时编译更改的枚举并加载它,也可以使用字节码操作来更改它。

简而言之,包含您需要的所有枚举,并且您永远不需要在运行时添加它们。例如,如果一周只有 7 天,则在编译时包含所有这些天。