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

StackOverflow https://stackoverflow.com/questions/241088

Вопрос

У меня есть код 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 значит заявление?

Это было полезно?

Решение

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

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

Другие советы

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

  };

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

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

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

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

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

Они составляют внутреннюю сферу. Переменная, объявленная внутри этих фигурных скобок, не видна вне их. Это также относится к 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; }

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top