我有一些Java代码以两种方式使用花括号
// Curly braces attached to an 'if' statement: if(node.getId() != null) { node.getId().apply(this); } // Curly braces by themselves: { Listcopy = new ArrayList (node.getArgs()); for(PExp e : copy) { e.apply(this); } } outAMethodExp(node);
在第一个if
声明之后,那些独立的花括号是什么意思?
额外括号的唯一目的是提供范围限制.该List
会只有那些括号内的存在,并让他们之外没有范围.
如果这是生成的代码,我假设代码生成器执行此操作以便它可以插入一些代码(例如此代码)而不必担心它插入了多少次List
而不必担心如果此代码段可能重命名变量不止一次插入同一个方法.
我认为matt b写的是什么,我将补充说,我见过的匿名大括号的另一个用途是在匿名类中声明一个隐式构造函数.例如:
Listnames = new ArrayList () { // I want to initialize this ArrayList instace in-line, // but I can't define a constructor for an anonymous class: { add("Adam"); add("Eve"); } };
一些单元测试框架已经将这种语法提升到另一个层次,这确实允许一些看起来完全无法编译的光滑的东西.由于他们看起来不熟悉,我自己并不是一个很大的粉丝,但至少要认识到如果遇到这种用途会发生什么事情是值得的.
我同意范围限制答案,但会增加一件事.
有时你会在喜欢折叠部分代码的人的代码中看到类似这样的结构,并且编辑器会自动折叠括号.他们使用它来折叠逻辑部分中的代码,这些部分不属于通常折叠的函数,类,循环等.