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语句之后的那些独立花括号是什么意思?

额外括号的唯一目的是提供范围限制。 List<PExp> copy将只存在于这些大括号中,并且在其之外没有范围。

如果这是生成的代码,我假设代码生成器这样做,所以它可以插入一些代码(如这样),而不必担心已经插入一个List<PExp> copy多less次,而不必担心可能的重命名如果这个代码片段被多次插入到同一个方法中的话。

我第二次写了什么马特,我会补充说,我看到匿名括号的另一个用途是在匿名类中声明一个隐含的构造函数。 例如:

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

一些unit testing框架已经把这个语法提升到了另一个层次,这允许一些看起来完全不可操作的光滑事物。 既然他们看起来不熟悉,我自己也不是那么大,但是至less可以认识到如果碰到这种用法会发生什么。

我同意范围限制的答案,但会增加一件事。

有时候,你会在喜欢折叠代码段的人的代码中看到这样的结构,并且有自动折叠花括号的编辑器。 他们使用它来折叠他们的代码的逻辑部分不落入函数,类,循环等,通常会被折叠起来。

我真的猜测有人忘记了其他的声明。

甚至很难有创build额外的块范围的麻烦。 在这种情况下,大多数情况下,有人更可能忘记input他们的控制语句,而不是他们在做聪明的事情。

他们是一个内在的范围。 在这些大括号内声明的variables在其外部是不可见的。 这也适用于C / C ++。

他们定义了一个新的范围,这意味着在这个范围内声明的所有内容在花括号之外是不可见的。

作为一个有趣的说明:大括号实际上启用了一类语句:声明。

这是非法的: if(a) int f;

但是这是合法的: if(a) { int f; } if(a) { int f; }

大括号对于减less开关/事件语句的范围也是有用的。

 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 } } 

我认为他们只是定义了一个无名的范围。

带一个作用域, 复制在它之外是不可见的,所以你可以稍后用相同的名字声明另一个variables。 并且可以在退出该范围后由垃圾收集器收集。 在这种情况下, 副本是一个临时variables,所以这是一个很好的例子。

它也用于初始化块 。