Java中的大括号本身是什么意思?

2022-08-31 12:06:56

我有一些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


答案 1

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

如果这是生成的代码,我假设代码生成器这样做,以便它可以插入一些代码(例如),而不必担心它插入了多少次,也不必担心如果此代码片段多次插入到同一方法中,则可能会重命名变量。List<PExp> copy


答案 2

我支持 matt 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");
      }

  };

一些单元测试框架已经将这种语法提升到了另一个层次,这确实允许一些看起来完全无法编译的光滑的东西工作。由于它们看起来很陌生,我自己并不是那么大的粉丝,但是如果你遇到这种用途,至少值得认识到发生了什么。