我昨天跑了一个有趣的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();
}
}
很高兴知道这确实有效,但任何人都可以想到一个合理的用例,你真的想要做这样的事情吗?与其他东西相比,它可能是最优雅的解决方案吗?
答案 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:
如果您需要从中创建实例 只有一个位置,没有 预先存在的特征类型 该课程,然后使其成为本地课程。