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