2013-09-28 158 views
2

我正在做一个程序,它有一个枚举,我们用于列表的类型,但我希望它有可能在运行时稍后扩展,我不确定什么是最好的方法来做到这一点是。我能想到的唯一方法是使用类的数组来代替我不想做的枚举,因为我会放弃枚举的简单性。可扩展的枚举Java

+1

“枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。”它在这里不再像是一个枚举:) – Zavior

+2

enum用于枚举在编译时已修复且已知的常量。如果您在编译时有一些尚未熟知的数据(即,您不知道这些数据或期望它经常更改),那么枚举不可能是表示它的最佳方式。 – scottb

+0

不,它不是xD – user2248702

回答

3

枚举应该是完全静态的枚举,因此你必须能够知道枚举覆盖在编译时的精确值。

您可以在编译时生成java文件,这样可以在值上有更多的灵活性,尽管这可能会比较高。

你最好的选择是:

1)要使用一个类,可能与一组预定义的情况下,使表示新的类实例可以在运行时创建的。

2)要创建包含一个枚举的默认值工具,允许在运行时被创建的新的实例,同时保持某种形式的枚举结构的接口。

+0

枚举的额外值只能被程序的扩展部分使用。 – user2248702

+0

@ user2248702“扩展部分”是什么意思? – Sinkingpoint

1

Java枚举不能在运行时扩展/扩展。它们更像常量。如果你需要可扩展的枚举,也许enum不适合你!

考虑使用在运行时实例化的简单类。

0

如果你不知道在编译时需要在那里的所有值,我只是使用字符串。如果您想将属性或行为关联到它,您可以使用地图。这在Java中很常见。另外在Python中,人们使用字符串作为枚举。

Java 7使switch语句对字符串起作用,IMO正在采取行动来支持这种字符串的使用。

对于Java中使用这样的一个例子,看到这一点: https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/telnet/TelnetClientInitializer.java

+0

使用字符串时,虽然会失去Java枚举的某些功能 - 但您无法为字符串的其他方法定义 – Sinkingpoint

+1

int或String类型的枚举模式在Java中应被视为反模式。Java enum语言功能提供了int/String枚举模式缺乏的类型安全和实例控制(以及对象可扩展性的大部分优点)的保证。而且,使用常量特定的枚举方法代替值上的'switch'语句的代码不那么脆弱并且更易于维护。 – scottb

+0

@scottb:我同意,除非需要支持的值在编译时不知道。那么你不能使用枚举。 –

0

枚举在编译时是固定的。你会如何“使用简单”?例如,您不能使用事先不知道的常量编写switch命令。你可以使用经典的OO分解(在列表中的每个类型中创建方法,并让多态选择正确的分支),或者使用类对象中的HashMap到功能对象或战略实施。