【问题标题】:Converting a string to the Enum class将字符串转换为 Enum 类
【发布时间】:2011-11-17 20:55:48
【问题描述】:

免责声明:我不会说我是最有经验的 Java 人。可以有更简单的方法来做我在我的例子中所做的事情。但这是一个关于将字符串条目转换为 Enum 类而不是 enum 变量的问题。我尽量解释清楚。

这是我想做的一个简单版本。我将有两个不同的枚举,我想根据用户的需要选择一个或另一个。这方面的例子,在代码中,将是

public enum Letters {
    A, B, C, D, E, ... , X, Y, Z
}

public enum Numbers {
    ONE, TWO, THREE, ..., EIGHT, NINE, TEN
}

public static void main(String [] args) {

    System.out.println("Enter in you choice, letters (Letters) or numbers(Numbers)");
    String entry = "";
    InputStreamReader input = new InputStreamReader(System.in);
    BufferedReader reader = new BufferedReader(input);
    try {
        entry = reader.readLine();
    }
    catch(Exception e){};
    ...
}

我想让用户这样,如果他输入“字母”,它将能够获取字符串条目并将其转换为对字母枚举的变量引用。省略号是代码的占位符。我想最终使用它,以便我可以使用

for (answer n : variable.values()) {
    System.out.println(n);
}

而不是

if (answer.equals("Numbers")) {
    Numbers n;
    for (n : Numbers.values()) {
        System.out.println(n);
    }
} else {
    Letters l;
    for (l : Letters.values()) {
        System.out.println(l);
    }
}

我试过了

Class<?> c = Class.forName("Letters");

但它不起作用。

在我的真实示例中,我有 3 个 .java 文件,其中包含单独的类,每个类中都有一个枚举。有 Sandwich、Beer 和 Chip 类,它们的枚举是 Sandwiches、Beers、Chips。这些类实现了一个接口 VendingMachineItem。最后,该接口是 vendingMachine 包的一部分。我不知道这些是否重要,但这是我能提供的所有信息。

【问题讨论】:

  • forName()调用中Letters类的名称需要全限定。
  • 那么,对于现实世界的例子,它会是 Class.forName("vendingMachine.VendingMachineItem.Sandwich.Sandwiches"); ?
  • 不是 Enum.valueOf 你在找什么吗?输入的数字Number = Numbers.valueOf(inputString);

标签: java string reflection enums


【解决方案1】:

以下作品(在Eclipse下用Java6测试):

package com.bob;
public class Test
{
    public enum Letters {
        A, B, C, D, E
    }

    public enum Numbers {
        ONE, TWO, THREE, FOUR, FIVE
    }

    public static void main(String [] args) throws Exception 
    {

        System.out.println("Enter in you choice, letters (Letters) or numbers(Numbers)");
        String entry = "";
        InputStreamReader input = new InputStreamReader(System.in);
        BufferedReader reader = new BufferedReader(input);
        entry = reader.readLine();

        Class<Enum<?>> clazz = (Class<Enum<?>>)Class.forName("com.bob.Test$" + entry);

        for (Enum<?> x : clazz.getEnumConstants())
        {
            System.out.println(x);
        }

    }
}

请注意,由于是内部类,枚举的完全限定类名是 com.bob.Test$Letterscom.bob.Test$Numbers。错误处理留作练习。

【讨论】:

  • 这就是我想要的。谢谢!
【解决方案2】:

我不确定我是否完全正确。但是你想做如下的事情吗?

    package com.test;

    enum EnumType {A1, A2, A3};

    public class Test {
        public static void main(String[] args) throws ClassNotFoundException {

            Class<?> clazz = Class.forName("com.test.EnumType");
            if (!clazz.isEnum()) {
                throw new IllegalArgumentException("Enum type expected");
            }

            Enum<?>[] constants = (Enum<?>[])clazz.getEnumConstants();

            for (Enum<?> constant : constants) {
                System.out.println(constant.name());
            }
        }
    }

【讨论】:

    【解决方案3】:

    您想使用valueOf()。如果选择是字母,那么您将使用Letters.valueOf(input),如果选择是数字,您将使用Numbers.valueOf(input)

    【讨论】:

      【解决方案4】:

      这就是你所追求的吗(使用 Java 6 语法)?

      String firstInput = // "Letters";
      String secondInput = // "A"
      
      Letters letter = null;
      Numbers number = null;
      
      if (Letters.class.getSimpleName().equals(input)) {
          letter = Enum.valueOf(Letters.class, secondInput);
      } 
      else if (Numbers.class.getSimpleName().equals(input)) {
          number = Enum.valueOf(Numbers.class, secondInput);
      } 
      

      使用上面的输入letter 将等于A 并且number 将在代码执行后保持null

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        • 2011-05-24
        • 1970-01-01
        • 2012-05-02
        相关资源
        最近更新 更多