Что фигурные скобки в 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/С++.
Ответ 6
Он также используется для блоков инициализации.
Ответ 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; }