可扩展枚举Java

sg2wtvxw  于 2023-02-28  发布在  Java
关注(0)|答案(5)|浏览(123)

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

6yt4nkrj

6yt4nkrj1#

枚举应该是完全静态的枚举,因此您必须能够在编译时知道枚举包含的确切值。
您可以在编译时生成java文件,从而允许在值上有更大的灵活性,尽管这样做有些过头。
你最好的选择是:
1)使用一个类,可能带有一组预定义的示例,以便在运行时创建该类的新示例。

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

aiqt4smr

aiqt4smr2#

Java枚举不能在运行时展开/扩展,它们更像是常量,如果你需要可扩展的枚举,也许enum不是适合你的概念!
考虑使用在运行时示例化的简单类。

wko9yo5t

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

w46czmvw

w46czmvw4#

枚举在编译时是固定的。你到底要如何“使用简单性”呢?例如,你不能用事先不知道的常量写一个switch命令。
如果要点是基于某个类型进行分支,那么可以使用经典的OO分解(在列表中的每个类型中创建方法,并让多态性选择正确的分支),或者使用从类对象到函数对象或策略实现的HashMap。

odopli94

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。

// 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
}

相关问题