Преобразование строки в класс Enum - PullRequest
6 голосов
/ 18 ноября 2011

Отказ от ответственности: я не собираюсь говорить, что я самый опытный человек 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){};
    ...
}

Я хочу сделать так, чтобы пользователь, если он введет в «Письма», он сможет взять строковый элемент и превратить его в переменнуюссылка на Письма 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.Я не знаю, имеют ли это значение, но это все, что я могу дать.

Ответы [ 4 ]

2 голосов
/ 18 ноября 2011

Следующие работы (протестированы с Java6 под Eclipse):

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$Letters и com.bob.Test$Numbers из-за того, что оно является внутренним классом. Обработка ошибок оставлена ​​в качестве упражнения.

1 голос
/ 18 ноября 2011

Вы хотите использовать valueOf().Если вы выберете буквы, то вы будете использовать Letters.valueOf(input), а если вы выберете цифры, вы будете использовать Numbers.valueOf(input).

1 голос
/ 18 ноября 2011

Я не уверен, правильно ли я вас понял.Но вы хотите сделать что-то вроде следующего?

    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());
            }
        }
    }
0 голосов
/ 18 ноября 2011

Это то, что вам нужно (с использованием синтаксиса 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 после выполнения кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...