Что означают фигурные скобки в Java сами по себе?
-
04-07-2019 - |
Вопрос
У меня есть код 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 служит временной переменной, поэтому это хороший пример.