2008-10-27 9 views
66

Я некоторые 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 заявления означает?

ответ

105

Единственная цель дополнительных брекетов - предоставить ограничение по объему. List<PExp> copy будет существовать только внутри этих фигурных скобок и не будет иметь границ вне их.

Если это сгенерированный код, я предполагаю, что генератор кода делает это, поэтому он может вставить некоторый код (например, этот), не беспокоясь о том, сколько раз он вставил List<PExp> copy и не беспокоиться о возможном переименовании переменные, если этот фрагмент вставляется в один и тот же метод более одного раза.

+5

Дополнительная "выгода" в данном случае является то, что `copy` может быть мусор, собранный до` outAMethodExp() `возвращает. Если это длительный или интенсивный вызов, это может быть полезно. Я добавляю «выгоду» в кавычки, потому что рефакторинг в отдельные методы, как правило, намного чище и яснее, чем использование этого синтаксиса. – dimo414 2015-02-16 21:56:59

+0

Фактически, определение области видимости переменной ** не влияет на сбор мусора. Во всех современных JVM, о которых я знаю, JIT может определить, что объект имеет право на GC, независимо от наличия или отсутствия конкретизирующих конструкций, таких как фигурные скобки. – 2016-10-19 09:46:00

2

Они делают внутренний объем. Переменная, объявленная внутри этих фигурных скобок, не видна вне их. Это также относится к C/C++.

0

Я думаю, что они просто определяют неназванный уровень охвата.

0

Они определяют новый масштаб, что означает, что все объявленные в этой области видимости не видны за фигурными фигурными скобками.

4

Я бы предположил, что кто-то забыл другое заявление.

Есть редко веская причина даже беспокоиться о создании дополнительных блоков. В этом и большинстве случаев гораздо более вероятно, что кто-то, возможно, забыл набрать их контрольное утверждение, чем то, что они делали что-то умное.

+2

Я голосую за тебя просто потому, что это может случиться, случилось, и Оккам катится в своей могиле, потому что тебя проголосовали. :) – willasaywhat 2008-10-27 19:53:03

+1

Он генерируется SableCC. Я ставлю 5 $, они не забыли еще – 2008-10-27 20:47:30

+0

Дополнительные фигурные скобки полезны для предотвращения глобальных переменных от ползучего на вас в длинном методе, где вы хотите сохранить несколько похожих блоков кода в одном и том же месте, где блоки не являются достаточно сложными, чтобы оправдывать новые методы. – jayunit100 2011-12-06 19:21:01

0

Присвоить область, копия не будет видна за ее пределами, поэтому вы можете объявить другую переменную с тем же именем позже. И он может быть собран сборщиком мусора сразу после выхода из этой области. В этом случае копия служит временной переменной, поэтому это хороший пример.

0

Как интересное примечание: фигурные скобки фактически включают класс операторов: декларации.

Это незаконно: if(a) int f;

, но это законно: if(a) { int f; }

24

я второй, что писал матовый б, и я добавлю, что другое использование я видел анонимные фигурные скобки объявить неявный конструктор в анонимных классах. Например:

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"); 
     } 

    }; 

Некоторые блок-тестирования структуры приняли этот синтаксис на другой уровень, который не позволяет некоторые скользкие вещи, которые выглядят совершенно uncompilable работать. Так как они смотри незнакомый, я сам не такой большой поклонник, но стоит хотя бы признать, что происходит, если вы столкнетесь с этим использованием.

7

Я согласен с лимитом ограничения объема, но добавлю одно.

Иногда вы видите такую ​​конструкцию в коде людей, которые любят складывать разделы своего кода и имеют редакторы, которые автоматически складывают фигурные скобки. Они используют его для сворачивания своего кода в логических разделах, которые не попадают в функцию, класс, цикл и т. Д., Которые обычно складываются.

0

Подтяжки также полезны для уменьшения объема в операторах 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 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^