将Enum类型值作为Java中的参数传递

时间:2017-04-11 07:45:40

标签: java enums

我知道我可以使用下面的伪代码描述的概念来检查String是否包含在特定的枚举中(我知道contains没有Enum方法,这只是我的例子):

Enum Animal {
    Dog,
    Cat,
    Human
}

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

但在以前的方式中,我需要为每个Enum 类实现 CheckValid 方法,因为我需要知道 WHICH < / strong>我应该检查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?中使用哪种类型(或关键字)。我知道我应该使用泛型,但我不知道该怎么做。谢谢!

3 个答案:

答案 0 :(得分:5)

如果名称与该类型的枚举常量匹配,则可以使用返回类型为T的枚举的静态方法Enum.valueOf(Class<T> enumType, String name)。否则抛出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;
    }
}

答案 1 :(得分:1)

不确定我是否完全了解您的需求,但我怀疑您希望通过enum任何 String中查看 - 如果是这种情况,那么有几种方法可以这样做。

首先 - 让我们定义你要找的东西 - 这样的东西?

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"));
}

答案 2 :(得分:0)

如果你实现一个通用方法会很好,java允许使用禁区,所以你可以肯定只能通过ENUM,并且由于接口你可以在编译时限制允许或不允许的枚举:

定义此通用方法

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