在运行时Java更改枚举

时间:2013-11-23 22:09:23

标签: java enums runtime

有没有办法在Java中为内置的枚举类添加元素?

我的问题类似于Can I add and remove elements of enumeration at runtime in Java,但这个问题似乎是为了构建自己的枚举然后修改它。我假设有一个我无法改变的现有枚举,比如

enum Days{ MONDAY, TUESDAY, WEDNESDAY }

我想在周四,周五等地添加它。不幸的是,关于如何使用界面来实现我的目标的建议,或其他比枚举更有效的方法,这里不适用。

据我所知,枚举是隐式最终的,所以我不能扩展它并添加更多元素。它有私有字段,但看起来我可以使用反射来访问那些 - 我是否可以更改其中一个私有字段,即使我不能添加新字段,即周一到周四更改?

编辑:对情况的澄清

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

2 个答案:

答案 0 :(得分:4)

枚举旨在成为具有常量感的静态,最终,不可变,实例控制的对象。只要您的项目包含编译时已知的事物的自然分组或列表,就应该考虑枚举。

JVM保证枚举在运行时是实例控制的和不可变的。枚举的二进制兼容性也得到保证,以便在以后添加枚举常量时,程序将继续运行。

简短的回答是:“不,没有简单的方法来扩展java中的枚举类。”

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

然后可以通过创建实现接口的新枚举来“扩展”枚举。即便如此,根据设计,这并不是打算在运行时进行的。

答案 1 :(得分:0)

您可以在运行时更改枚举,我在运行时更改类,然后再加载它。您可以在运行时编译更改的枚举并加载它,也可以使用字节代码操作来改变它。

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