如何在方法中传递枚举参数

时间:2019-03-13 12:02:09

标签: java parameters enums

我有2个枚举类:

public enum Dogs
{
 JACKIE("Jackie"),
 BOBBY("Bobby");
}

public enum Cats
    {
     CHAN("Chan"),
     SPONGE("Sponge");
    }

现在我在其他一些类中有一个方法,希望将枚举作为参数传递,因此我可以根据需要选择其中一个。

public void findAnimal()
{
    List<Dogs> animals = Arrays.asList(Dogs.values());
    for (Dogs animal: animals)
    {
        rest of the code goes here
    }
}

因此,我不想提供硬编码的“狗”,而是希望有一个选择并将参数传递给方法,例如

public void (Enum enumAnimals)
{
    List<Enum> animals = Arrays.asList(Enum.values());
    for (Enum animal: animals)
}

但是它不这样接受。可以将通用类型传递为“枚举”吗?

3 个答案:

答案 0 :(得分:5)

Enum all 枚举的 base 类,因此Enum.values()不会做任何事情。如果要使用多个枚举,可以让它们实现一个通用接口,但是即使那样,您也需要提供实例。这个可以通过反思来完成,但是我觉得告诉你,权力现在将成为灾难的根源。通常,枚举用于诸如AnimalType之类的静态类型,而不用于诸如特定猫之类的单个实例。

我建议您使用类似的代码(简短的代码来简化它):

enum AnimalType { 
  CAT,
  DOG;
}

class Animal {
  String name;
  AnimalType type;

  Animal( String n, AnimalType t) {
    name = n;
    type = t;
  }
}

Set<Animal> animals = ... //create a set
animals.add( new Animal( "Jackie", AnimalType.CAT ) );
animals.add( new Animal( "Chan", AnimalType.DOG) );
...

请注意,许多使用类似Animal这样的类的示例/教程都更加关注继承,即class Cat extends Animal等。在问题的各行之间阅读使我感到这实际上是您的实际情况之后,而不是如何使用枚举。

答案 1 :(得分:1)

您尝试的方法在很大程度上无法正常工作,因为Enum本身没有values方法。这是枚举类的隐式静态方法。

如果您绝对必须使用单独的DogsCats枚举类型执行此操作,而不是使用Thomas suggests的方式进行操作,则可以传递结果values的调用:

obj.findAnimal(Dogs.values());
// or
obj.findAnimal(Cats.values());

然后该方法将很简单:

public void findAnimal(Enum[] animals) {
    for (Enum animal : animals) {
        System.out.println(animal);
    }
}

如果由于某种原因不适合,也可以使用Class.getEnumConstants:您可以通过而不是传递DogsCats在他们的班级:

obj.findAnimal(Dogs.class);
// or
obj.findAnimal(Cats.class);

该方法将遵循以下原则:

public void findAnimal(Class enumClass)
{
    Enum[] animals = (Enum[])enumClass.getEnumConstants();
    for (Enum animal: animals) {
        System.out.println(animal);
    }
}

(感谢Pshemo指出可以使用getEnumConstants显着简化我的早期版本。)

答案 2 :(得分:0)

不太清楚您要使用此方法执行的操作,但是可以执行以下操作。

enum Dogs {
    JACKIE("Jackie"),
    BOBBY("Bobby");
    private final String name;

    Dogs(String name) {
        this.name = name;
    }
}

enum Cats {
    CHAN("Chan"),
    SPONGE("Sponge");
    private final String name;

    Cats(String name) {
        this.name = name;
    }
}

<E extends Enum<E>> void method(E e) {
    Enum<E>[] animals = e.getClass().getEnumConstants();
    for (Enum<E> animal : animals) {
        System.out.println(animal);
    }
}

private void test() {
    method(Dogs.BOBBY);
    method(Cats.CHAN);
}