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

Ответ 1

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

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

Ответ 2

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

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

  };

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

Ответ 3

Я согласен с ответом на ограничение области видимости, но добавлю одно.

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

Ответ 4

Я бы предположил, что кто-то забыли оператор else.

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

Ответ 5

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

Ответ 7

Скобки также полезны для уменьшения объема в операторах 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
  }
}

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

Как интересное примечание: скобки на самом деле позволяют класс операторов: декларации.

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

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