Java 中的匿名代码块

新手上路,请多包涵

Java 中匿名代码块有实际用途吗?

 public static void main(String[] args) {
    // in
    {
        // out
    }
}

请注意,这与 命名 块无关,即

name: {
     if ( /* something */ )
         break name;
}

.

原文由 Robert Munteanu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 458
2 个回答

他们限制变量范围。

 public void foo()
{
    {
        int i = 10;
    }
    System.out.println(i); // Won't compile.
}

但在实践中,如果您发现自己使用这样的代码块,这可能表明您想要将该块重构为一个方法。

原文由 David Seiler 发布,翻译遵循 CC BY-SA 2.5 许可协议

@David Seiler 的回答是正确的,但我认为代码块非常有用,应该经常使用,并不一定表示需要分解到方法中。我发现它们对于构建 Swing 组件树特别有用,例如:

 JPanel mainPanel = new JPanel(new BorderLayout());
{
    JLabel centerLabel = new JLabel();
    centerLabel.setText("Hello World");
    mainPanel.add(centerLabel, BorderLayout.CENTER);
}
{
    JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0,0));
    {
        JLabel label1 = new JLabel();
        label1.setText("Hello");
        southPanel.add(label1);
    }
    {
        JLabel label2 = new JLabel();
        label2.setText("World");
        southPanel.add(label2);
    }
    mainPanel.add(southPanel, BorderLayout.SOUTH);
}

代码块不仅尽可能严格地限制了变量的范围(这总是好的,尤其是在处理可变状态和非最终变量时),而且它们还以 XML / HTML 制作的方式说明了组件层次结构代码更易于阅读、编写和维护。

我将每个组件实例分解为方法的问题是

  1. 该方法只会被使用一次,但会暴露给更广泛的受众,即使它是一个私有实例方法。
  2. 它更难阅读,想象一个更深更复杂的组件树,你必须向下钻取以找到你感兴趣的代码,然后松开视觉上下文。

在这个 Swing 示例中,我发现当复杂性确实变得超出可管理性时,它表明是时候将树的一个分支分解为一个新类而不是一堆小方法了。

原文由 Stephen Swensen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题