【问题标题】:Java Enum with field of type enum具有枚举类型字段的 Java 枚举
【发布时间】:2021-12-22 20:34:10
【问题描述】:

不知道如何表达这个问题,所以请随时更新它。 我有一个复杂的枚举,它根据枚举值引用其他枚举,如下所示:

public enum EFormSw {

    OBJ_KEY_LIST("Object Keys", EObjKeyType.class),
    OBJ_NOTE_LIST("Object Notes",  EObjNoteType.class);

public final String label;
public final Class</*"E is an Enum"*/> enumType;

// Constructor...

我希望能够在另一个班级做的是写一些类似的东西

EFormSw.OBJ_KEY_LIST.enumType.values().someThingElse().

只有在字段类型明确这是一个枚举时才有可能。

有什么办法可以做到这一点吗?

【问题讨论】:

  • 你的意思是像EFormSw.OBJ_KEY_LIST.enumType.values()这样的东西吗?我看不到您如何直接从EFormSw 访问enumType。您必须使用OBJ_KEY_LISTOBJ_NOTE_LIST
  • @Sweeper:是的,当然,这是一个错字。感谢您指出这一点!
  • 那么问题来了,如果你知道是OBJ_KEY_LIST,为什么不能直接EObjKeyType.values()呢?如果你不知道它是哪个常量,那么你只会得到一个Enum&lt;?&gt;s 的数组,因为每个常量都有不同类型的enumType,你不知道它是哪一个。这对你真的有用吗?
  • 代码 sn-p 是主题的简化,以使问题对于 SO 问题更加精确。在实际代码中,会出现对 EFormSw 枚举的迭代,导致这个问题。

标签: java enums enumeration abstraction


【解决方案1】:

你可以把enumType变成Class&lt;? extends Enum&lt;?&gt;&gt;

enum EFormSw {

  OBJ_KEY_LIST("Object Keys", EObjKeyType.class),
  OBJ_NOTE_LIST("Object Notes", EObjNoteType.class);

  private final String label;
  private final Class<? extends Enum<?>> enumType;

  EFormSw(String label, Class<? extends Enum<?>> enumType) {
    this.label = label;
    this.enumType = enumType;
  }

  public String getLabel() {
    return label;
  }

  public Class<? extends Enum<?>> getEnumType() {
    return enumType;
  }
}

当您循环遍历EFormSw 的值时,您可以使用getEnumConstants 来获得一个代表枚举类型的枚举值的Enum&lt;?&gt;[],但是您将无法用它做很多事情,因为你不知道它是哪个确切的枚举类型:

for (EFormSw constant: EFormSw.values()) {
    Enum<?>[] values = constant.getEnumType().getEnumConstants();
}

(您仍然可以在数组元素上调用java.lang.Enumjava.lang.Object 中声明的大多数方法,所以如果您只需要这些方法,就可以使用它。)

如果您想使用EObjKeyTypeEObjNoteType 之间共享的一些通用功能,您可以将所有通用功能提取到它们都实现的通用接口中:

interface EObjType {
    // ...
}

enum EObjKeyType implements EObjType {
    // ...
}

enum EObjNoteType implements EObjType {
    // ...
}

然后将enumType改为:

private final Class<? extends EObjType > enumType;

现在您可以改为使用EObjType[]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多