Случаи переключения Java: с фигурными скобками или без них? - PullRequest
78 голосов
/ 11 марта 2009

Рассмотрим следующие два фрагмента с фигурными скобками:

switch (var) {
  case FOO: {
    x = x + 1;
    break;
  }

  case BAR: {
    y = y + 1;
    break;
  }
}

без брекетов:

switch (var) {
  case FOO:
    x = x + 1;
    break;

  case BAR:
    y = y + 1;
    break;
}

Я знаю, что во фрагменте с фигурными скобками создается новая область видимости, заключая каждый регистр в фигурные скобки. Однако если каждому случаю не нужна новая область (т. Е. Имена переменных не используются повторно), существует ли какое-либо снижение производительности за использование скобок с регистром?

Ответы [ 9 ]

88 голосов
/ 11 марта 2009

есть ли какое-либо ухудшение производительности за использование скобок с кейсом?

Отсутствует.

Здесь есть фигурные скобки, помогающие компилятору определить область действия переменной, условия, объявления функции и т. Д. Это не влияет на производительность среды выполнения после компиляции кода в исполняемый файл.

19 голосов
/ 11 марта 2009

Нет потери производительности с точки зрения исполнения.

Небольшое снижение производительности с точки зрения компиляции, так как есть еще что-то для разбора, но если бы кто-то действительно беспокоился об этом, им пришлось бы написать свой код в одной строке: -)

А теперь о мнении в нашем посте ... Я всегда вставляю {и}, потому что есть штраф за ремонтопригодность, потому что вам, вероятно, придется добавить их позже, и это может быть боль откладывает их позже ... но это на 103% личное предпочтение.

19 голосов
/ 11 марта 2009

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

12 голосов
/ 11 марта 2009

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

Открывающая фигурная скобка обычно ассоциируется с чем-то значимым, например, с началом функции, началом цикла, началом объявления класса или началом инициализации массива и т. Д. Мы знаем, что случай выходит из блока переключателей, когда он сталкивается с оператором перерыва. Таким образом, использование фигурных скобок, по-видимому, подразумевает представление о другой области видимости для невежественного читателя. Поэтому лучше избегать использования фигурных скобок для лучшей читабельности программирования.

т.е. Когда у меня что-то типа,

switch(i)
{
  case 1 :
  {
     //do something
  }
  System.out.println("Hello from 1");

  case 2: 
  ....
}

«Привет из 1» печатается. Но использование фигурных скобок может указывать невежественному читателю, что случай заканчивается на «}», уже зная, что в основном означают фигурные скобки в случае циклов, методов и т. Д.

Как у нас есть операторы перехода к метке в 'C', элемент управления просто переключается на регистр и продолжает свое выполнение. Итак, с этим пониманием это просто ПЛОХАЯ практика использовать фигурные скобки при написании кейсов для switch.

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

Мое предложение: просто не используйте окружающие фигурные скобки для переключателей.

8 голосов
/ 11 марта 2009

С брекетами.

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

  1. Забыть обрывы и, таким образом, иметь провалы в кейсе
  2. Забывает случай по умолчанию и, таким образом, не перехватывает необработанное условие
  3. Случайное повторное использование переменных между инструкциями case, или, что еще хуже, влияет на переменную, которая разделяет переменную между операторами case.

Использование фигурных скобок является одним из способов предотвращения как преднамеренного, так и случайного совместного использования переменных между операторами case

5 голосов
/ 11 марта 2009

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

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

5 голосов
/ 11 марта 2009

Этот вопрос, вероятно, будет закрыт как «спорный» (BRACE WAR!), Но, черт возьми. Мне на самом деле нравятся брекеты после чехлов. Для меня это делает уродливый синтаксис переключателя больше похожим на остальные языковые конструкции. (В этом «случае» штраф за использование фигурных скобок отсутствует)

3 голосов
/ 11 марта 2009

Я бы не использовал фигурные скобки для переключателей.

  • Оператор switch выглядит достаточно барокко уже без фигурных скобок.

  • Случаи переключения должны быть очень короткими. Когда вам нужно объявить переменные, это признак того, что вы делаете это неправильно.

Теперь перейдем к поддержке некоторого унаследованного кода C, который переключает дела на более чем 500 строк ...

1 голос
/ 11 марта 2009

Я никогда не думал об этом раньше. Никогда не нужны фигурные скобки в кейсе, поэтому не могу понять, зачем они вам нужны. Лично я не согласен с идеей «будет проще поддерживать», это просто мусор, его будет проще поддерживать, если код имеет смысл и задокументирован.

Без скобок ... меньше синтаксис больше

...