为什么在Java中使用静态嵌套接口?

2022-08-31 05:41:08

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

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

我以前从未见过这个。原始开发人员遥不可及。因此,我不得不问SO:

静态接口背后的语义是什么?如果我删除 ?为什么有人会这样做?static


答案 1

上面示例中的 static 关键字是冗余的(嵌套接口自动为“static”),可以删除而不影响语义;我建议将其删除。接口方法上的“公共”和接口字段上的“公共最终”也是如此 - 修饰符是多余的,只会给源代码增加混乱。

无论哪种方式,开发人员都只是简单地声明一个名为 Foo.Bar 的接口。与封闭类没有进一步的关联,除了无法访问Foo的代码也无法访问 Foo.Bar。(从源代码 - 字节码或反射可以访问 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() {...}
});

答案 2

这个问题已经得到解答,但是使用嵌套接口的一个很好的理由是,它的函数是否与它所在的类直接相关。一个很好的例子是 .如果你有一个类,并且你希望其他类能够侦听它上的事件,你可以声明一个名为 的接口,这是可以的,但是声明一个嵌套接口并让其他类实现可能会更清楚(嵌套类与此一起还不错)。ListenerFooFooListenerFoo.ListenerFoo.Event


推荐