我刚刚在我们的代码库中发现了一个静电嵌套接口.

class Foo {
    public static interface Bar {
        /* snip */
    }
    /* snip */
}

我以前从未见过这种情况.原来的开发商遥不可及.因此,我不得不这样问:

静态接口背后的语义是什么?如果我go 掉static,会有什么变化?为什么会有人这么做?

推荐答案

上面示例中的static关键字是冗余的(嵌套接口自动为"static"),可以在不影响语义的情况下删除;我建议将其移除.接口方法上的"public"和接口字段上的"public final"也是如此——修饰符是多余的,只会给源代码增添混乱.

无论哪种方式,开发人员只需声明一个名为Foo的接口.wine 吧除了无法访问Foo的代码将无法访问Foo之外,与封闭类没有进一步的关联.也可以.(来自源代码——字节码或反射可以访问Foo.Bar,即使Foo是包私有的!)

如果希望只从外部类使用嵌套接口,这样就可以创建嵌套接口,这样就不会创建新的顶级名称.例如:

public class Foo {
    public interface Bar {
        void callback();
    }
    public static void registerCallback(Bar bar) {...}
}
// ...elsewhere...
Foo.registerCallback(new Foo.Bar() {
    public void callback() {...}
});

Java相关问答推荐

当列顺序更改时,Table View列列表的Change. wasPermanted()总是返回假

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

OpenJDK、4K显示和文本质量

在现代操作系统/硬件上按块访问数据值得吗?

JUnit—如何模拟局部变量对象方法调用

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

解析Javadoc时链接的全限定类名

JavaFX Maven Assembly插件一直打包到错误的JDK版本

通过合并Akka Streams中的多个慢源保持订购

无法在WebSocket onMessage中捕获错误

RichFaces 3.x-Spring Boot-迁移web.xml

Java中的死锁及其重入锁和锁

Kotlin内联互操作:强制装箱

什么是Java原子属性的正确getter和setter

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

在Java中使用StorageReference将数据从Firebase存储添加到数组列表

如何使用Hibernate v6.2构建NamingStrategy,以表名作为所有列的前缀?

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

[Guice/MissingImplementation]:未绑定任何实现

如何在Java上为循环数组从synchronized迁移到ReentrantLock