Что означают фигурные скобки в 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 ответов


единственная цель дополнительных фигурных скобок-предоставить ограничение области. The 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; }


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


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