一个街区内的类 - 这会有意义吗?

时间:2011-07-10 15:42:52

标签: java language-features

我昨天跑了一个有趣的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();
    }
}

很高兴知道这确实有效,但任何人都可以想到一个合理的用例,你真的想要做这样的事情吗?与其他东西相比,它可能是最优雅的解决方案吗?

2 个答案:

答案 0 :(得分:2)

我想你在扩展或实现类或接口时会这样做,其中实现非常特定于你所在的范围。通常你会看到人们使用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() );
}

答案 1 :(得分:2)

来自Effective Java 2nd Edition:

  

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