Используйте значения перечисления для переключения - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть класс Aligment, как показано ниже:

public enum Aligment
    {
        Evil,
        Neutral,
        Good,
        Undefined
    }

И я хочу использовать эти значения в switch следующим образом:

System.out.print("Choose you'r start up character" +
                     "1.Good" +
                     "2.Evil" +
                     "3.Neutral");
    //1  string alignmentChoice = scan.nextLine();
    //2  Aligment alignmentChoice = Aligment.Undefined;
    switch( aligmentChoice )
    {
       case Good:
        alignment = Aligment.Good;
        break;

       case Evil:
        alignment = Aligment.Evil;
        break;

       case Neutral:
        alignment = Aligment.Neutral;
        break;

       default:
        System.out.println("How did you manage to get here? You have broke the system.");
        break;

     }

И я не уверен, как использоватьэто как // 1 или // 2.Заранее спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Создайте отображение (статическую карту) внутри вашего перечисления для хранения карты между именем , которое будет предоставлено пользователем перечислению.

public enum Alignment {
    Evil("Evil"),
    Neutral("Neutral"),
    Good("Good"),
    Undefined("Undefined");

    private static final Map<String, Alignment> MAPPINGS = new HashMap<>();
    static {
        for (Alignment alignment : Alignment.values()) {
            MAPPINGS.put(alignment.getName(), alignment);
        }
    }

    private String name;
    Alignment(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Alignment getAlignmentForName(String name) {
        return MAPPINGS.get(name);
    }

Теперь вы можете использовать getAlignmentForName, чтобы отобразить пользовательский ввод в enum. Он вернет null для недопустимых значений.

Преимущество этого заключается в том, что вам не нужно менять код при добавлении нового экземпляра enum ... В вашем случае необходимо добавить соответствующий регистр переключателей.

Примечание: Имена полей перечисления должны быть заглавными буквами в соответствии с соглашениями .

0 голосов
/ 09 ноября 2018

Если вы реорганизуете и перемещаете эту логику регистра переключателя в метод в вашем перечислении, вам больше не нужно использовать инструкцию switch для получения перечисления из строки.

В следующем примере я добавил метод fromString(), который будет принимать строковый ввод name и сравнивать его со всеми нашими значениями перечисления (без учета регистра).

Если подходящее значение не найдено, мы бросаем IllegalArgumentException.

Вот пример:

public class AlignmentTest{

     public static void main(String[] args){

        String good = "good";
        String neutral = "NEUTRAL";
        String evil = "EvIl";
        String unknown = "unknown";

        Alignment alignment1 = Alignment.fromString(good);
        System.out.println("Alignment 1: " + alignment1);

        Alignment alignment2 = Alignment.fromString(neutral);
        System.out.println("Alignment 2: " + alignment2);

        Alignment alignment3 = Alignment.fromString(evil);
        System.out.println("Alignment 3: " + alignment3);

        Alignment alignment4 = Alignment.fromString(unknown);
        System.out.println("Alignment 4: " + alignment4);
     }

     public enum Alignment {   
        EVIL("Evil"),
        NEUTRAL("Neutral"),
        GOOD("Good");

        private String name;

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

        public String getName() {
            return this.name;
        }

        public static Alignment fromString(String name) {
            for (Alignment alignment : Alignment.values()) {
                if (alignment.name.equalsIgnoreCase(name)) {
                    return alignment;
                }
            }
            throw new IllegalArgumentException("No alignment with name " + name + " found");
        }
    }
}

Это выводит следующее:

Alignment 1: GOOD
Alignment 2: NEUTRAL
Alignment 3: EVIL
Exception in thread "main" java.lang.IllegalArgumentException: No alignment with name unknown found
    at AlignmentTest$Alignment.fromString(AlignmentTest.java:44)
    at AlignmentTest.main(AlignmentTest.java:19)
0 голосов
/ 09 ноября 2018

Используйте это так:

switch(Aligment.valueOf(alignmentChoise)) {
   case Evil: 
     alignment = Aligment.Evil;
     break;
}

Примечание: Это выдаст IllegalArgumentException, если константа enum не найдена.

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