Есть ли разница в удалении фигурных скобок из операторов If в java

во время просмотра учебника thenewboston на basic java он учит нас делать такие утверждения, как if.(Обратите внимание на фигурные скобки)

if("pie"== "pie"){
    System.out.println("Hurrah!");
}

поэтому я попытался удалить фигурные скобки

if("pie"== "pie")
    System.out.println("Hurrah!");

и он все еще работает! Поскольку я новичок в Java, я не знаю, почему это работает. И я хочу знать, дает ли удаление(или добавление) фигурных скобок какие-либо преимущества/недостатки.

16 ответов


на один заявление он останется прежним, но если вы хотите сгруппировать более одного оператора в блоке if, вам нужно использовать фигурные скобки.

if("pie"== "pie"){
    System.out.println("Hurrah!");
    System.out.println("Hurrah!2");
}

if("pie"== "pie")
    System.out.println("Hurrah!"); //without braces only this statement will fall under if
    System.out.println("Hurrah!2"); //not this one

вы увидите: блоки в Java

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

class BlockDemo {
     public static void main(String[] args) {
          boolean condition = true;
          if (condition) { // begin block 1
               System.out.println("Condition is true.");
          } // end block one
          else { // begin block 2
               System.out.println("Condition is false.");
          } // end block 2
     }
}

(пример из приведенной выше ссылки)


как говорит @rajesh, фигурные скобки являются необязательными, когда тело является одним оператором.

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

if("pie"== "pie")
    System.out.println("Hurrah!");
    System.out.println("Tricked you");

второй печати, Tricked you, на самом деле не в if, это просто выглядит так из-за отступа.

это только точка стиля, не общепринятая, и, конечно, компетентный программист должен уметь читать обе формы.

нет, нет абсолютно никакой разницы: пара фигурных скобок делает несколько заявлений в один; if, while, for, и так далее ожидать одного оператора; если вам нужно охранять только один оператор, вам не нужны фигурные скобки.

тем не менее, многие магазины программного обеспечения настаивают на наличии скобок даже для одного оператора. Причина в таких ошибках:

if (x > 20)
    x -= 7;
    y -= 8;

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


нет, но реальная опасность возникает, когда код редактируется позже. Относительно легко редактировать что-то вроде:

if (someCondition) 
    // do something 

to

if (someCondition) 
    // do something
    // do something else important

и подумайте, что "сделать что-то еще важное" будет выполняться только тогда, когда someCondition истинно. Отступ вводит в заблуждение :-)

в скобках эта опасность отсутствует.


Если есть только одно утверждение после if тогда скобки не являются обязательными.

Теперь, если у вас есть блок кода, который должен попадать под if условие, тогда вам нужно использовать фигурные скобки.

Это хорошо для loops а также


это вопрос стиля, который применяется к ряду языков, включая Java, C++, C и c#.

Если блок кода содержит только одну строку, фигурные скобки можно опустить. Это относится к любой структуре управления: if, while, for, do-while.

например, два цикла ниже эквивалентны.

for(int i=0; i<100; i++)
  doSomething(i);



for(int i=0; i<100; i++) {
  doSomething(i);
}

достоинством опуская {}: Ваш код может быть короче - значит меньше. Некоторые могут чувствовать это больше читаемый.

недостаток опуская {}: Если вы позже измените свой код и вам нужно добавить еще одну строку в блок кода, вам лучше не забыть добавить их {}. Если нет, то напишите код ниже:

for(int i=0; i<100; i++)
  doSomething(i);
  doSomethingElse(i);

Это действительно эквивалентно:

for(int i=0; i<100; i++) {
  doSomething(i);
}
doSomethingElse(i);

фигурные скобки обычно предназначены для блока операторов. Без фигурных скобок в заявление. Не весь блок, который начинается с { и заканчивается }

if("pie" == "pie") {
   System.out.println("Executes if pie==pie");
   System.out.println("So does this");
}

и

if("pie" == "pie")
   System.out.println("Executes if pie==pie");
System.out.println("Executes, regardless of if pie is equal to pie");

обратите внимание, однако, если вы хотите сравнить два String объекты, использовать .equals() метод String. Этот пример все еще работает, потому что он сравнивает одну постоянную строку с собой, что всегда верно.


Это то же самое, если количество предложений равно один. Если их несколько, Вам нужен синтаксис {}


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

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

теперь предположим, что этот код не работает из-за какой-то внутренней проблемы. Вы хотите проверить вход. Итак, вы делаете следующее изменить:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )

скажем, вы устраняете проблему и развертываете этот код (и, возможно, рецензент и вы думаете, что это не вызовет проблемы, так как его нет внутри условия "Prod"). Волшебным образом ваши производственные журналы теперь печатают информацию о кредитной карте клиента, которая видна всем сотрудникам, которые могут видеть журналы. Не дай бог, если кто-то из них (со злым умыслом) завладеет этими данными.

таким образом, не давая скобки и немного небрежное кодирование может часто привести к нарушению защитить информацию. Он также классифицируется как уязвимость в JAVA по CERT - установка программного обеспечения, CMU.


для одного утверждения не проблема

if("pie"== "pie")
System.out.println("Hurrah!");

для двух или более операторов после, если вам нужны фигурные скобки

if("pie"== "pie"){
System.out.println("Hurrah!");
System.out.println("Hi!");
}

использовать .equals () для сравнения, а не ==.


Он будет работать нормально, если есть только один оператор после if условие.

if("pie"== "pie")
    System.out.println("Hurrah!");
    System.out.println("second statement");// this will not print

но здесь оба заявления напечатают

if("pie"== "pie")
{
System.out.println("Hurrah!");
System.out.println("second statement");
}

Я бы посоветовал вам использовать, как показано ниже, даже если вы хотите напечатать одну инструкцию.

if("pie".equals("pie"))
   {
       System.out.println("Hurrah!");
       System.out.println("second statement");
   }

и я хочу знать, дает ли удаление (или добавление) фигурных скобок какие-либо преимущества/недостатки?

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

if("pie".equals("pie"))
    System.out.println("Hurrah!");

затем, если вы хотите добавить дополнительную строку кода, вам нужно обязательно добавить фигурные скобки:

if("pie".equals("pie")) {
    log.debug("I am here!");
    System.out.println("Hurrah!");
}

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

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


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


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


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

if(++colorIndex == someColors.length)
            colorIndex = 0;
        setForeground(currentColor());
        repaint();

тогда он больше не будет работать.

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


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

есть один фактический аргумент по этому поводу, который иллюстрирует разумную проблему, которая может возникнуть. Как вы знаете, все отступы и дополнительные пробелы удаляются из кода при его анализе. Проблемы могут возникнуть, когда вы пытаетесь использовать одну строку else операторы после нескольких однострочных if заявления. Например:

if("cherry".equals("cherry"))
    if("pie".equals("pie"))
        System.out.println("Hurrah!");
else
    System.out.println("Rats!");

становится неотличимой от

if("cherry".equals("cherry"))
    if("pie".equals("pie"))
        System.out.println("Hurrah!");
    else
        System.out.println("Rats!");

даже в этом случае автоматическая настройка табуляции должна указывать, какой if сообщении else указывает, но это то, что вы, безусловно, должны быть осторожны, если вы решите обойти правила Я часто так делаю.