java - block 内的类 - 这在哪里有意义?

标签 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();
    }
}

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

最佳答案

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

更新

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

此外,Java 使用本地类来实现/模仿闭包。将下面代码中的 CloseWindowListener 转换为私有(private)静态类将需要更多代码,因为您必须创建一个自定义构造函数和私有(private)字段来包含 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 - block 内的类 - 这在哪里有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642012/

相关文章:

java - 使用java在Excel中只读单个单元格

Python ? (条件/三元)赋值运算符

python - Smalltalk(例如 Pharo)与 Python 相比如何?

python - 你知道其他有像 Python 这样的交互模式的编程语言吗?

java - Swing:全局键盘快捷键

java - 使用 java 将字符串插入到日期时间 mysql 列中。

javascript - 为什么这段代码会抛出 ReferenceError : test is not defined?

f# - F#的隐藏特性

java - 在 Java 应用程序中导入/导出 Google 联系人

java - JQuery Ajax POST 方法不起作用? $.post