Что фигурные скобки в Java означают сами по себе?


у меня есть Java-код, который использует фигурные скобки двумя способами

// Curly braces attached to an 'if' statement:
if(node.getId() != null)
{
    node.getId().apply(this);
}

// Curly braces by themselves:
{
    List<PExp> copy = new ArrayList<PExp>(node.getArgs());
    for(PExp e : copy)
    {
        e.apply(this);
    }
}
outAMethodExp(node);

что делают эти автономные фигурные скобки после первого if заявление означает?

11 70

11 ответов:

единственная цель дополнительных фигурных скобок-обеспечить ограничение области. Элемент List<PExp> copy будет существовать только в этих фигурных скобках и не будет иметь области вне их.

Если это сгенерированный код, я предполагаю, что генератор кода делает это, чтобы он мог вставить некоторый код (например, этот), не беспокоясь о том, сколько раз он вставил List<PExp> copy и без необходимости беспокоиться о возможном переименовании переменных, если этот фрагмент вставлен в один и тот же метод более чем однажды.

Я поддерживаю то, что написал Мэтт Б, и я добавлю, что еще одно использование анонимных фигурных скобок, которое я видел, - это объявление неявного конструктора в анонимных классах. Например:

  List<String> names = new ArrayList<String>() {
    // I want to initialize this ArrayList instace in-line,
    // but I can't define a constructor for an anonymous class:
      {
        add("Adam");
        add("Eve");
      }

  };

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

Я согласен с ограничением объема ответа, но хотел бы добавить одну вещь.

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

Я бы даже предположил, что кто-то забыл еще заявление.

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

Они делают внутренний объем. Переменная, объявленная внутри этих фигурных скобок, не видна за их пределами. Это также относится к C/C++.

фигурные скобки также полезны для уменьшения области действия в операторах switch/case.

switch(foo) {
  case BAR:
     int i = ...
     ...
  case BAZ:
     int i = ... // error, "i" already defined in scope
}

но вы можете написать

switch(foo) {
  case BAR:{
     int i = ...
     ...
  }
  case BAZ:{
     int i = ... // OK
  }
}

Он также используется для инициализация блоков.

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

как интересное примечание: фигурные скобки фактически позволяют класс операторов: объявления.

это незаконно: if(a) int f;

но это законно: if(a) { int f; }

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

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