簡體   English   中英

具有 enum 類型字段的 Java 枚舉

[英]Java Enum with field of type enum

不知道如何表述這個問題,所以請隨時更新它。 我有一個復雜的枚舉,它根據枚舉值引用其他枚舉,如下所示:

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().

這只有在字段類型清楚這是一個枚舉時才有可能。

有什么方法可以實現這一目標嗎?

您可以使enumType成為Class<? extends Enum<?>> Class<? extends Enum<?>>

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<?>[]表示枚舉類型的枚舉值,但您將無法使用它做太多事情,因為您沒有知道它是哪種確切的枚舉類型:

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[]來代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM