// Define an expandable string enum class
public final class Color extends ExpandableStringEnum<Color> {
public static final Color RED = fromString("Red", Color.class);
public static final Color GREEN = fromString("Green", Color.class);
public static final Color BLUE = fromString("Blue", Color.class);
}
// Create an instance of an expandable string enum from a String value
Color color = Color.fromString("Red", Color.class);
// Compare two instances of an expandable string enum
if (color == Color.RED) {
// do something
}
5条答案
按热度按时间6yt4nkrj1#
枚举应该是完全静态的枚举,因此您必须能够在编译时知道枚举包含的确切值。
您可以在编译时生成java文件,从而允许在值上有更大的灵活性,尽管这样做有些过头。
你最好的选择是:
1)使用一个类,可能带有一组预定义的示例,以便在运行时创建该类的新示例。
或
2)创建一个包含默认值的枚举实现的接口,允许在运行时创建新示例,同时保留某种形式的枚举结构。
aiqt4smr2#
Java枚举不能在运行时展开/扩展,它们更像是常量,如果你需要可扩展的枚举,也许
enum
不是适合你的概念!考虑使用在运行时示例化的简单类。
wko9yo5t3#
如果你不能知道所有需要在编译时存在的值,我就使用字符串;如果你想关联属性或行为,你可以使用Map;这在Java中相当常见;在python中,人们也使用字符串作为枚举。
Java 7使switch语句在字符串上工作,IMO是支持这种字符串使用的一个举措。
有关Java中此类用法的示例,请参见:https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/telnet/TelnetClientInitializer.java
w46czmvw4#
枚举在编译时是固定的。你到底要如何“使用简单性”呢?例如,你不能用事先不知道的常量写一个
switch
命令。如果要点是基于某个类型进行分支,那么可以使用经典的OO分解(在列表中的每个类型中创建方法,并让多态性选择正确的分支),或者使用从类对象到函数对象或策略实现的HashMap。
odopli945#
您可以尝试使用ExpandableStringEnum。https://learn.microsoft.com/en-us/java/api/com.azure.core.util.expandablestringenum?view=azure-java-stable
它有equals(对象)和values(),equals(对象)用于比较,values()返回一个集合API,你可以使用它进行枚举,你也可以在运行时示例化一个类型。
使用fromString(字符串名称,类clazz)API。