有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

块中的java类,这在哪里有意义?

昨天我遇到了一件有趣的事

当前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) 个答案

  1. # 1 楼答案

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

    摘自Java第二版:

    If you need to create instances from only one location and there is no preexisting type that characterizes the class, then make it a local class.