昨天我遇到了一个有趣的question

Block Statement的当前定义是here

BlockStatement: LocalVariableDeclarationStatement ClassDeclaration Statement


这意味着您可以执行以下操作

class A {

    public void doIt() {
        class B {}
        B b = new B();
    }
}


或这个

public class Test {
    static
    {
        class C {}
        C c = new C();
    }
}


很高兴知道这确实可行,但是没有人能想到一个合理的用例,而您实际上想做这样的事情?与别的东西相比,这可能是最优雅的解决方案?

最佳答案

我想您会在扩展或实现一个类或接口时执行此操作,其中实现非常特定于您所处的范围。通常您会看到有人使用anonymous inner classes进行此操作,但是如果您想了解一点更多的代码重用,同时仍然将类限制在您所使用的方法的范围内,您可以改用这些本地内部类之一。

更新资料

在许多情况下,您会发现私有静态类比本地内部类更有意义。但是,标准实践要求我们将类的范围限制在最有效的范围内,以避免名称空间等混乱。

而且,Java使用本地类来实现/模仿闭包。将下面代码中的CloseWindowListener转换为私有静态类将需要更多代码,因为您必须创建一个自定义构造函数和私有字段来包含window变量。但是因为类是在此方法的范围内定义的,所以我们可以直接访问它。

public void setupWindowHandlers(Window window) {
    class CloseWindowListener extends ActionListener {
        public void actionPerformed(ActionEvent event) {
            window.close();
        }
    }
    closeButton.addActionListener( new CloseWindowListener() );
    cancelButton.addActionListener( new CloseWindowListener() );
}

07-24 09:33