我刚刚在我们的代码库中找到了一个静态嵌套接口。
class Foo { public static interface Bar { /* snip */ } /* snip */ }
我以前从未见过这种情况。原始开发人员遥不可及。因此我不得不问:
静态接口背后的语义是什么?如果我删除static? 为什么会有人这样做?
static
上例中的 static 关键字是多余的(嵌套接口自动为“静态”),可以删除而不影响语义;我建议将其删除。接口方法上的“public”和接口字段上的“public final”也是如此——修饰符是多余的,只会给源代码添加混乱。
无论哪种方式,开发人员都只是简单地声明了一个名为 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() {...} });