Looking for java Keywords? Try Ask4Keywords

Java Language Pitfall - Оставляя брекеты: проблемы с «болтающимися, если» и «болтающимися»


пример

В последней версии руководства по стилю Java Java указано, что операторы «then» и «else» в операторе if всегда должны быть заключены в «фигурные скобки» или «фигурные скобки». Аналогичные правила применяются к телам различных операторов цикла.

if (a) {           // <- open brace
    doSomething();
    doSomeMore();
}                  // <- close brace

Синтаксис языка Java на самом деле не требуется. В самом деле, если «то» часть оператора if является единственным выражением, то законно оставить фигурные скобки

if (a)
    doSomething();

или даже

if (a) doSomething();

Однако есть опасность игнорировать правила стиля Java и оставлять фигурные скобки. В частности, вы значительно увеличиваете риск того, что код с ошибочным отступом будет неверно истолкован.

Проблема «болтаться»:

Рассмотрим пример кода сверху, переписанный без брекетов.

if (a)
   doSomething();
   doSomeMore();

Этот код, кажется, говорит, что вызовы doSomething и doSomeMore будут возникать тогда и только тогда, когда a true . Фактически, код имеет неправильный отступ. Спецификация языка Java, что doSomeMore() представляет собой отдельный оператор, следующий за оператором if . Правильный отступ выглядит следующим образом:

if (a)
   doSomething();
doSomeMore();

Проблема «болтаться еще»

Вторая проблема возникает, когда мы добавляем else к миксу. Рассмотрим следующий пример с отсутствующими фигурными скобками.

if (a)
   if (b)
      doX();
   else if (c)
      doY(); 
else
   doZ();

Вышеприведенный код говорит, что doZ будет вызываться, когда a является false . Фактически, отступ неверен еще раз. Правильный отступ для кода:

if (a)
   if (b)
      doX();
   else if (c)
      doY(); 
   else
      doZ();

Если код был написан в соответствии с правилами стиля Java, это выглядело бы так:

if (a) {
   if (b) {
      doX();
   } else if (c) {
      doY(); 
   } else {
      doZ();
   }
}

Чтобы проиллюстрировать, почему это лучше, предположите, что вы случайно ошиблись в коде. У вас может получиться что-то вроде этого:

if (a) {                         if (a) {
   if (b) {                          if (b) {
      doX();                            doX();
   } else if (c) {                   } else if (c) {
      doY();                            doY();
} else {                         } else {
   doZ();                            doZ();
}                                    }
}                                }

Но в обоих случаях ошибочный код «выглядит неправильно» для глаз опытного Java-программиста.