【问题标题】:How to pass enum parameter in a method如何在方法中传递枚举参数
【发布时间】:2019-03-13 12:02:08
【问题描述】:

我有 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)
}

但它不接受这样的。是否可以将泛型类型作为“枚举”传递?

【问题讨论】:

  • 你的枚举可以实现一个通用接口。你想在 for 循环中做什么?
  • 这似乎是对枚举的根本滥用。我希望 Chan、Sponge 等都是类的对象,而不是枚举成员。
  • @BenR。 R. 也许我提供了错误的值示例,但我需要字符串值而不是类的对象。这些名称不会更改,并将在应用程序/代码中的许多地方使用。这就是为什么我需要它们保持不变。
  • @KlitosKyriacou 在'for循环'中我会做这样的事情: input.typeName(animal.getName()) if(some condition) { String newName = animal.getName();休息; }

标签: java parameters enums


【解决方案1】:

Enumall 枚举的 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 等。阅读您问题的字里行间让我觉得这就是您真正想要的,而不是如何使用枚举。

【讨论】:

    【解决方案2】:

    您尝试的方法在很大程度上不起作用,因为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 进行显着简化。)

    【讨论】:

      【解决方案3】:

      不太确定你想用这个方法做什么,但你可以做这样的事情。

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

      【讨论】:

        猜你喜欢
        • 2011-01-04
        • 2019-07-23
        • 2012-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多