为什么在Java中使用静态内部接口?

问题:

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

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

我从来没有见过这个。原始开发人员不可及。所以我要问:
静态接口背后的语义是什么?如果我删除static,会有什么变化?为什么会有人这样做?

回答:

上述示例中的static关键字是多余的(嵌套接口自动为“static”),可以删除而不影响语义;我会推荐它被删除。接口方法上的“public”和接口字段上的“public final”也是一样 – 修饰符是多余的,只是增加了源代码的混乱。
无论哪种方式,开发人员只需声明一个名为Foo.Bar的接口。与封闭类没有进一步关联,除了无法访问Foo的代码将无法访问Foo.Bar。 (源代码 – 字节码或反射可以访问Foo.Bar,即使Foo是package-private!)
如果您希望仅从外部类使用,则以这种方式创建嵌套接口是可接受的风格,以便您不创建新的顶级名称。例如:

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

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why would a static inner interface be used in Java?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 4 = 5