簡體   English   中英

在Java中將Enum類型值作為參數傳遞

[英]Pass Enum type value as a parameter in Java

我知道我可以使用下面的偽代碼描述的概念來檢查特定的Enum中是否包含字符串(我知道Enum沒有contains方法,僅用於我的示例):

Enum Animal {
    Dog,
    Cat,
    Human
}

public boolean CheckAnimalValid(String name){
    return Animal.contains(name)? true : false;
}

但是以以前的方式,我需要為每個Enum類實現CheckValid方法,因為我需要知道應該檢查WHICH Enum類。

我想知道是否有任何方法可以將Enum類型作為參數傳遞給函數,這樣我就可以這樣做:

Enum Animal {
        Dog,
        Cat,
        Person
    }

Enum Plant {
    Grass,
    Flower,
    Tree
}

public boolean CheckEnumValid(String name, what_should_I_do? enum){
    return enum.contains(name)? true : false;
}

我想知道在what_should_I_do中應該使用哪種類型(或關鍵字) 在前面的代碼中。 我知道我應該使用泛型,但我不知道該怎么做。 謝謝!

您可以使用靜態方法Enum.valueOf(Class<T> enumType, String name) ,如果該名稱與該類型的枚舉常量匹配,則該方法返回類型T的枚舉。 否則拋出IllegalArgumentException

用法示例:

Enum.valueOf(Plant.class, "Flower");

包裝在返回布爾值的方法中:

public <T extends Enum<T>> boolean checkValid(Class<T> enumType, String name){
    try {
        Enum.valueOf(enumType, name);
        return true;
    } catch(IllegalArgumentException e) {
        return false;
    }
}

不確定我是否完全理解您的需求,但我懷疑您是否想在String中的任何 enum查找-如果是這種情況,那么可以通過多種方法進行。

首先-讓我們定義您要尋找的東西-這樣的東西?

interface Lookup<S,T> {
    T lookup(S s);
}

現在您可以調整每個enum以執行以下操作:

enum Animal implements Lookup<String,Animal>{
    Dog,
    Cat,
    Person;
    Map<String,Animal> lookup = Arrays.stream(Animal.values())
            .collect(Collectors.toMap(e -> e.name(), e -> e));
    public Animal lookup(String name) {
        return lookup.get(name);
    }
}

但是我懷疑您想這樣做而不破壞所有 enums -這將是一件痛苦的事情。 這是使用輔助對象的一種方法。

class EnumLookup<E extends Enum<E>> implements Lookup<String,E> {
    final Map<String,E> lookup;

    public EnumLookup(Class<E> clazz) {
        lookup = Arrays.stream(clazz.getEnumConstants())
                .collect(Collectors.toMap(e -> e.name(), e -> e));
    }

    @Override
    public E lookup(String s) {
        return lookup.get(s);
    }
}

現在,您可以創建其中之一來隨時查詢enum

enum Plant {
    Grass,
    Flower,
    Tree;
}

public void test() {
    EnumLookup<Plant> lookup = new EnumLookup<>(Plant.class);
    System.out.println("Tree -> "+lookup.lookup("Tree"));
}

如果您改為實現通用方法,那就太好了,java允許使用禁忌症,因此可以確保只通過枚舉,並且由於有了接口,您可以在編譯時限制允許或不允許的枚舉:

定義此通用方法

public <T extends Enum<?> & ITag> void printEnum(T d) {
        System.out.println(d.name());
    }

定義標簽接口:

interface ITag {
}

現在,您可以標記僅在方法中有效的枚舉:

enum Color implements ITag {
    RED, GREEN, BLUE
}

enum STATE {
    ON, OFF
}

enum CONNECTION {
    UDP, TCP
}

結果,您可以在編譯時檢查方法是否采用了正確的參數...

 printEnum(Color.GREEN); //valid
 printEnum(STATE.OFF);// invalid The method printEnum(T)... is not applicable for the arguments..
 printEnum(CONNECTION.UDP);// invalid The method printEnum(T)... is not applicable for the arguments..
 printEnum("Green"); // invalid The method printEnum(T)... is not applicable for the arguments..

暫無
暫無

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

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