Что означают фигурные скобки в Java? - PullRequest
74 голосов
/ 27 октября 2008

У меня есть некоторый код 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 ]

116 голосов
/ 27 октября 2008

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

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

25 голосов
/ 28 октября 2008

Я второй, что написал matt 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");
      }

  };

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

7 голосов
/ 28 октября 2008

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

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

4 голосов
/ 27 октября 2008

Я бы на самом деле предположил, что кто-то забыл другое утверждение.

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

2 голосов
/ 27 октября 2008

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

1 голос
/ 16 марта 2015

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

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

0 голосов
/ 27 октября 2008

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

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

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

0 голосов
/ 27 октября 2008

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

0 голосов
/ 27 октября 2008

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

...