У вас должен быть экземпляр типа enum (его член ), на который вы переключаетесь. Вы пытаетесь включить сам класс Enum, который является бессмысленной конструкцией. Поэтому вам, вероятно, понадобится
colors col = colors.valueOf(colorGuess);
switch (col) ...
BTW, имя должно быть Colors
, а не colors
, чтобы соблюдать очень важное и необязательное соглашение об именах Java.
Вы можете получить перечисление из строки с помощью 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
, как только вы закончите с ним.
IllegalArgumentException
передаст недопустимую строку, с которой OP пытается справиться. – dimo414 7 November 2013 в 16:29