У меня есть код 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
оператора?
java
syntax
scope
curly-braces
Пол Уикс
источник
источник
copy
передoutAMethodExp()
возвратом можно выполнить сборку мусора . Если это длительный вызов или вызов, требующий интенсивного использования памяти, это может быть полезно. Я заключил «выгоду» в кавычки, потому что рефакторинг в отдельные методы, как правило, намного чище и понятнее, чем использование преимуществ этого синтаксиса.Я вторю тому, что написал Мэтт Б., и добавлю, что еще одно использование анонимных скобок, которое я видел, - это объявление неявного конструктора в анонимных классах. Например:
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"); } };
Некоторые фреймворки для модульного тестирования подняли этот синтаксис на другой уровень, что позволяет некоторым хитростям, которые выглядят совершенно некомпилируемыми, работать. Поскольку они выглядят незнакомыми, я сам не такой большой поклонник, но стоит хотя бы понять, что происходит, если вы столкнетесь с этим использованием.
источник
super(...)
.Я согласен с ответом на ограничение объема, но добавлю одно.
Иногда вы видите подобную конструкцию в коде людей, которые любят сворачивать разделы своего кода и имеют редакторы, которые автоматически складывают фигурные скобки. Они используют его для сворачивания своего кода в логические секции, которые не попадают в функцию, класс, цикл и т. Д., Которые обычно сворачиваются.
источник
На самом деле я предполагаю, что кто-то забыл заявление else.
Редко есть веская причина даже беспокоиться о создании дополнительных областей видимости блока. В этом и в большинстве случаев гораздо более вероятно, что кто-то забыл ввести свой управляющий оператор, чем что он сделал что-то умное.
источник
Они составляют внутреннюю область. Переменная, объявленная внутри этих фигурных скобок, не видна вне их. Это также относится к 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 } }
источник
Он также используется для блоков инициализации .
источник
static
противном случае это блок инициализации экземпляра .Они определяют новую область видимости, что означает, что все, что объявлено в этой области, не видно за пределами фигурных скобок.
источник
Интересное примечание: фигурные скобки фактически включают класс операторов: объявления.
Это незаконно:
if(a) int f;
но это законно:
if(a) { int f; }
источник
Я думаю, они просто определяют безымянный уровень охвата.
источник
Принесите область видимости, копия не будет видна за ее пределами, поэтому вы можете объявить другую переменную с тем же именем позже. И он может быть собран сборщиком мусора сразу после выхода из этой области. В этом случае копия служит временной переменной, так что это хороший пример.
источник