簡體   English   中英

通用枚舉迭代器Java

[英]Generic enum iterator java

我的枚舉

public enum ExamStausEnum {

    RESULTAWAITED("Result Awaiting"), 
    PASSED("Passed"), 
    FAILED("Failed");

    private String value;

    ExamStausEnum(String value) {
        this.value = value;
    }

    @JsonValue
    public String getValue() {
        return value;
    }
}

通用迭代器枚舉

static <E extends Enum <E>> void foo(Class<E> elemType) {
    for (E e : java.util.EnumSet.allOf(elemType)) {
        System.out.println(e);
    }
}

結果:

RESULTAWAITED
PASSED
FAILED

如何打印構造函數值?

Result Awaiting
Passed
Failed

不可避免地要添加另一個參數來抽象getValue()調用:

static <E extends Enum <E>> void foo(Class<E> elemType, Function<? super E, ?> f) {
    for(E e : java.util.EnumSet.allOf(elemType)) {
        System.out.println(f.apply(e));
    }
}

然后,您可以調用不一定具有該方法的任意enum類型,例如

foo(Thread.State.class, Object::toString);

或對於具有以下方法的特定enum

foo(ExamStausEnum.class, ExamStausEnum::getValue);

可能還有更多用例:

foo(Thread.State.class, Enum::name);

要么

foo(ExamStausEnum.class, Enum::ordinal);

當然,您還可以讓您的ExamStausEnum類型覆蓋toString()方法,從而無需foo來調用getValue()方法。

更先進的方法是創建一個接口,聲明所有枚舉實現的getValue()方法。

interface EnumWithValue{
   @JsonValue
   String getValue();
}

public enum ExamStausEnum implements EnumWithValue {

    RESULTAWAITED("Result Awaiting"), 
    PASSED("Passed"), 
    FAILED("Failed");

    private String value;

    ExamStausEnum(String value) {
        this.value = value;
    }

    @Override
    public String getValue() {
        return value;
    }
}

然后可以將您的枚舉轉換為foo

static <E extends Enum <E>> void foo(Class<E> elemType) {
    for (E e : java.util.EnumSet.allOf(elemType)) {
        System.out.println(((EnumWithValue)e).getValue());
    }
}

暫無
暫無

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

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