Java中的匿名代码块

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

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

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

请注意,这不是关于命名块,即

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

.

提问于
用户回答回答于

他们限制可变范围。

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

但实际上,如果你发现自己使用这样的代码块,这可能是你想要将该块重构为方法的标志。

用户回答回答于

@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示例中,我发现当复杂性确实超出可管理性时,它表明是时候将树的一个分支分解为一个新类,而不是一堆小方法。

扫码关注云+社区