Чехлы для переключателей Java: с фигурными скобками или без?

85

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

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;
}

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

cdmckay
источник

Ответы:

99

есть ли какое-либо снижение производительности за использование скоб с футляром?

Никто.

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

MrValdez
источник
21

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

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

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

Тофу пиво
источник
Мне немного любопытно, потому что я сам не вижу ответа ... @TofuBeer, когда тебе нужно добавить фигурные скобки? Кроме того, я полностью согласен с пунктом ремонтопригодности, я просто не вижу проблемы ремонтопригодности ATM. РЕДАКТИРОВАТЬ: забудь. Я просто прочитал остальные ответы ниже.
nyaray
В некоторых случаях вы делаете это на C ++, поэтому, если вы работаете на обоих языках, неплохо было бы освоить ни один из них.
TofuBeer
13

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

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

т.е. когда у меня есть что-то вроде,

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

  case 2: 
  ....
}

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

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

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

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

Настоящий красный.
источник
5
Не согласен с этим. Использование фигурных скобок И написание кода вне фигурных скобок было бы очень плохим тоном, да, но это не дискредитирует использование фигурных скобок само по себе.
Макс Ронкаче,
12

С подтяжками.

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

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

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

jklp
источник
8
Включение пунктов 1 и 2 вводило в заблуждение для этого вопроса (для меня); ваша заключительная строка должна явно указывать, что фигурные скобки решают только 3 - я думал, вы имели в виду, что фигурные скобки исключают необходимость разрывов, а затем попробовали.
ataulm 08
Пункт 3 даже не имеет смысла. Вы не можете повторно использовать переменные, если они не были объявлены в родительской области оператора switch. Это означает, что если вы объявляете переменную внутри case, то ее нельзя использовать в другом заявлении case. Если вы объявляете переменную над оператором switch (в родительской области), тогда не имеет значения, используете ли вы фигурные скобки или нет, операторы case будут иметь доступ к переменной.
dsingleton 01
Я только что (повторно) обнаружил, что переменные, объявленные в случае 1, все еще могут быть в области видимости в случае 2. Например: ...case 1: int a = 10; break; case 2: int a = 11; break; ...не компилируется. (протестировано с Oracle JDK 8)
anuragw
5

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

Энди Уайт
источник
Думаю, это своего рода объективный вопрос ... Я отказываюсь от аргументов
Энди Уайт
Я предпочитаю без скоб ... Я считаю, что они добавляют много ненужного шума.
cdmckay
Да, я бы хотел, чтобы это было больше похоже на это: case (FOO) {x = x + 1} case (BAR) {y = y + 1}
Энди Уайт
Разумный пробел == красиво. Ненужные брекеты == отстой.
Shog9,
3
пробел == сочетание табуляции и пробелов == отстой (просто подумал, что добавлю в микс комментарий табуляции и пробела)
Энди Уайт
5

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

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

Жалкая переменная
источник
3

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

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

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

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

звездно-голубой
источник
1

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

Без фигурных скобок ... меньше синтаксиса - больше

Гарет Дэвис
источник
{и} также выделяют вещи, что упрощает чтение (IMO).
TofuBeer,
Ага. Я собирался поделиться историей о методе, который мне когда-то пришлось изменить (у меня ушло около 4 часов, чтобы добавить одну строку кода), но код был безумным (около 10 страниц в длину и 4 страницы в ширину при печати), поэтому это не так. типичный случай. Но если бы он использовал {}, то на его добавление ушла бы минута.
TofuBeer,
Я думаю, что суть здесь в том, что если бы исходный программист приложил усилия, чтобы вставить блоки {}, чтобы код был более читабельным, он, возможно, действительно позаботился о том, чтобы писать оператор переключения на 10 страниц и изменил код на немного менее безумный
Гарет Дэвис
swtich был бы мечтой ... он был вложенным, если бы / elses ... был написан на C ++ программистами COBOL ... Вскоре после этого я ушел.
TofuBeer,