Как обнаружить новое значение было добавлено в перечисление и не обрабатывается в переключателе - PullRequest
6 голосов
/ 22 октября 2010

Время от времени мне приходится добавлять новое значение в тип enum в моем проекте.

public enum Day {
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, 
   FILENOTFOUND //this one is new one
}

Мне бы хотелось, чтобы ошибка времени компиляции для каждого моего переключателя, который не обрабатывает новое значение, как этот:

switch (color) {
        case MONDAY: 
        case TUESDAY: 
        case WEDNESDAY: 
        case THURSDAY: 
                    System.out.println("Mondays are bad.");
                     break;

        case FRIDAY: System.out.println("Fridays are better.");
                     break;

        case SATURDAY:
        case SUNDAY: System.out.println("Weekends are best.");
                     break;
    } 

Наличие значения по умолчанию: это исключение не достаточно хорошо, я бы хотел, чтобы это было время компиляции.

Я не думаю, что это возможно, но, возможно, у кого-то есть хитрость ...

Я думал, что у Findbugs будет правило, чтобы найти их, но я видел только это: Eq: ковариантный метод equals (), определенный для enum (EQ_DONT_DEFINE_EQUALS_FOR_ENUM)

РЕДАКТИРОВАТЬ: Я выбираю ответ Марка, я использую Eclipse, и это звучит так же, как мне нужно! Я вообще не эксперт по поиску багов, поэтому мог пропустить такую ​​функциональность, хотя я так не думаю.

Ответы [ 3 ]

7 голосов
/ 22 октября 2010

Eclipse имеет предупреждение / ошибку времени компиляции, которое вы можете включить: Константа перечисления не включена в "switch".

В свойствах вашего проекта (или общих настройках) перейдите на Java Compiler -> Ошибки / предупреждения , отметьте Включить специфические для проекта настройки . Вы найдете предупреждение под Потенциальные проблемы программирования . Он установлен на Игнорировать по умолчанию, но вы можете увеличить его до Предупреждение или Ошибка .

Редактировать: Я думал, что это само собой разумеется, но, полагаю, я все равно скажу: это применимо, только если вы разрабатываете в Eclipse или используете его для управления сборкой. Очевидно, что Findbugs или аналогичный эквивалент будет «реальным» ответом, поскольку он выходит за пределы IDE и может быть интегрирован в процесс сборки.

2 голосов
/ 22 октября 2010

Вы можете сделать это, добавив предложение по умолчанию и войдя в систему при посещении:

switch (color) {
default:
    log.error("Unknown color in switch: " + color);
    break

case MONDAY: /*FALLTHROUGH*/
case TUESDAY: 

(добавление дополнительных комментариев поможет последующим сопровождающим решить, забыли ли вы код или нет: -))

Редактировать Уточнение скопировано из комментариев к ответу Марка:

Подобные случаи, связанные с функцией IDE, подходят для разработчика в момент изменения, но не фиксируют изменения в других частях кода, от которых зависит ваш код.

Он не делает код cient, содержащий переключатели перечислений, устойчивым к изменениям, если они не перекомпилированы с новой версией.

Это помогает, когда код клиента регистрирует необработанные случаи; развернутый код не всегда имеет полный контроль над своим путем к классам или версиями библиотек в нем.

0 голосов
/ 23 октября 2010

IntelliJ был проверкой, где были установлены не все дела. Он имеет авто-исправление для заполнения пропущенных дел.

...