Java 在一个区块内初始化-这在哪里有意义?

Java 在一个区块内初始化-这在哪里有意义?,java,language-features,Java,Language Features,我昨天偶然发现了一件有趣的事 块语句的当前定义为 这意味着你可以这样做 class A { public void doIt() { class B {} B b = new B(); } } 还是这个 public class Test { static { class C {} C c = new C(); } } 很高兴知道这实际上是可行的,但是有人能想到一个合理的用例,在这个用

我昨天偶然发现了一件有趣的事

块语句的当前定义为

这意味着你可以这样做

class A {

    public void doIt() {
        class B {}
        B b = new B();
    }
}
还是这个

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

很高兴知道这实际上是可行的,但是有人能想到一个合理的用例,在这个用例中,你真的想做这样的事情吗?与其他解决方案相比,它可能是最优雅的解决方案

我想象您在扩展或实现类或接口时会这样做,因为类或接口的实现非常特定于您所处的范围。通常情况下,您会看到有人这样做,但是如果您希望获得更多的代码重用,同时仍然将类限制在您所在的方法的范围内,您可以使用这些本地内部类中的一个

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

此外,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() );
}

摘自Java第二版:

如果需要从创建实例 只有一个位置,没有 具有特征的预先存在的类型 类,然后使其成为本地类


我明白了,这比使用匿名内部类(如果您在同一个方法中多次这样做,那么会有很多样板文件)更多的代码重用,但是与其用这种构造吓唬您的同事,不如使用封闭类的私有(静态)内部类:)?这个论点不错。它胜过使用两个匿名内部类,因为它保存了样板文件。正如我在另一个问题中回答的那样,如果需要在类中定义构造函数(在匿名内部类中不可能),它可以用作匿名内部类的替代品。这绝对是一个优势,但我还是希望有一个封闭类的内部类,不是吗?为什么?用它生成一个局部类会限制作用域,通常最好使变量和类的作用域尽可能小。
public void setupWindowHandlers(Window window) {
    class CloseWindowListener extends ActionListener {
        public void actionPerformed(ActionEvent event) {
            window.close();
        }
    }
    closeButton.addActionListener( new CloseWindowListener() );
    cancelButton.addActionListener( new CloseWindowListener() );
}