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