Что означают фигурные скобки в 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; }
принесите прицел,скопировать не будет виден вне его, поэтому вы можете объявить другую переменную с тем же именем позже. И он может быть собран сборщиком мусора сразу после выхода из этой области. В этом случае скопировать служит временной переменной, поэтому это хороший пример.