簡體   English   中英

將字符串轉換為Enum類

[英]Converting a string to the Enum class

免責聲明:我不會說我是最有經驗的Java人。 可以有更簡單的方法來完成我的示例中的操作。 但這是一個關於將字符串條目轉換為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){};
    ...
}

我想讓用戶如此,如果他輸入“Letters”,它將能夠獲取字符串條目並將其轉換為Letters Enum的變量引用。 省略號是代碼的占位符。 我想最終使用它,所以我可以使用

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文件,其中包含單獨的類,並且每個文件都有一個枚舉。 有三明治,啤酒和芯片類,他們的口號是三明治,啤酒,薯片。 這些類實現了VendingMachineItem接口。 最后,該接口是vendingMachine包的一部分。 我不知道這些是否重要,但這就是我能提供的所有信息。

以下工作(在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 錯誤處理留作練習。

我不確定我是否完全正確。 但是你想做下面這樣的事嗎?

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

你想使用valueOf() 如果選擇是字母,那么你將使用Letters.valueOf(input) ,如果選擇是數字,你將使用Numbers.valueOf(input)

這就是你所使用的(使用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

暫無
暫無

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

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