Сравнить значения enum для строк java [duplicate]

(list(set(a)-set(b))+list(set(b)-set(a)))
8
задан gm95 7 November 2013 в 15:58
поделиться

2 ответа

У вас должен быть экземпляр типа enum (его член ), на который вы переключаетесь. Вы пытаетесь включить сам класс Enum, который является бессмысленной конструкцией. Поэтому вам, вероятно, понадобится

colors col = colors.valueOf(colorGuess);
switch (col) ...

BTW, имя должно быть Colors, а не colors, чтобы соблюдать очень важное и необязательное соглашение об именах Java.

13
ответ дан Marko Topolnik 20 August 2018 в 21:56
поделиться
  • 1
    и в случаях должно быть указано имя класса перечислимого класса – Bohemian♦ 7 November 2013 в 16:02
  • 2
    Нет, подразумевается имя класса перечисления. – Marko Topolnik 7 November 2013 в 16:04
  • 3
    @Bohemian: это неверно на самом деле; просто красный и черный будут делать в этом случае. – ljgw 7 November 2013 в 16:04
  • 4
    Большое спасибо. За какое-то время использовал ненужный if if else if – gm95 7 November 2013 в 16:08
  • 5
    Осторожно, это приведет к тому, что IllegalArgumentException передаст недопустимую строку, с которой OP пытается справиться. – dimo414 7 November 2013 в 16:29

Вы можете получить перечисление из строки с помощью Enum.valueOf() . Позаботьтесь о том, чтобы в других ответах не упоминалось, что Enum.valueOf() выдает IllegalArgumentException, если передается строка, которая не является допустимым членом перечисления.

Не забудьте правильно форматировать и отступать от кода, он помогает нам (и вам!) читать его и понимать, что происходит:

// note the capitalization, and the singular 'Color'
private enum Color {RED, BLACK}; 

// At least with the code provided, you don't need colorGuess or colorVerify to be
// instance variables, they can be local to the method.  Limiting the amount of
// time a variable lives for (its scope) is critical for quality, maintainable code

public Color getColorGuess() {
  Scanner in = new Scanner(System.in); // this should be outside the while loop
  while(in.hasNextLine()) {
    // .toUpperCase() lets you type "red" or "RED" and still match
    String line = in.nextLine().toUpperCase();
    try {
      // Enum.valueOf() throws an exception if the input is not valid
      Color guess = Color.valueOf(line);

      switch(guess) {
        case RED:
          return guess; // return, rather than break, to exit the method
        case BLACK:
          return guess;
        // As long as your switch statement covers all cases in your enum, you
        // don't need a default: case, you'll never reach it
      }
    } catch (IllegalArgumentException e) {
      System.out.println("Invalid color selection!");
    }
  }
}

Обратите внимание, что мы теперь возвращаем guess в обоих случаях, что несколько избыточно. По крайней мере, с приведенным вами примером кода вам фактически не нужно отслеживать colorVerify вообще, потому что метод будет продолжать цикл навсегда до тех пор, пока не будет введен допустимый цвет. Вы можете заменить весь оператор switch в моем методе простым return guess;, поскольку вы знаете, что это допустимое предположение, как только Color.valueOf() возвращает значение.

Другими словами, вы можете очистить свой код до:

public static Color getColorGuess() {
  try (Scanner in = new Scanner(System.in)) {
    while(in.hasNextLine()) {
      try {
        return Color.valueOf(in.nextLine().toUpperCase());
      } catch (IllegalArgumentException e) {
        System.out.println("Invalid color selection!");
      }
    }
  }
}

Обратите внимание, что метод теперь static и использует блок try-with-resources , чтобы закрыть Scanner, как только вы закончите с ним.

3
ответ дан dimo414 20 August 2018 в 21:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: