我刚刚在我们的代码库中找到了一个静态嵌套接口。
class Foo {
public static interface Bar {
/* snip */
}
/* snip */
}
我以前从未见过。原始开发人员遥不可及。因此,我不得不问:
静态接口背后的语义是什么?如果我删除,会发生什么变化static?为什么有人会这样做?
上例中的static关键字是多余的(嵌套接口自动为“ static”),可以删除而不会影响语义;我建议将其删除。接口方法上的“公共”和接口字段上的“公共最终”也是如此-修饰符是多余的,只会给源代码增加混乱。
无论哪种方式,开发人员都只是声明一个名为Foo.Bar的接口。与封闭类没有进一步的关联,除了无法访问Foo的代码也将无法访问Foo.Bar。(从源代码开始,即使Foo是程序包私有的,字节码或反射也可以访问Foo.Bar!)
如果希望仅在外部类中使用嵌套接口,则可以通过这种方式创建嵌套接口,这样您就不必创建新的顶级名称。例如:
public class Foo {
public interface Bar {
void callback();
}
public static void registerCallback(Bar bar) {...}
}
// ...elsewhere...
Foo.registerCallback(new Foo.Bar() {
public void callback() {...}
});
问题内容: 我正在查看Java代码,并注意到它使用了静态嵌套类。 使用静态嵌套类而不是普通内部类的原因是什么? 我能想到的唯一原因是Entry不能访问实例变量,因此从OOP的角度来看,它具有更好的封装性。 但是我认为可能还有其他原因,也许是性能。可能是什么? 注意。我希望我的术语正确,可以将其称为静态内部类,但是我认为这是错误的:http : //java.sun.com/docs/books/t
问题内容: 什么是静态嵌套类?静态和非静态嵌套类有什么区别? 问题答案: 静态内部类是嵌套在具有修饰符的另一个类中的类。除了可以访问在其内部定义的类的私有成员之外,它与顶级类几乎相同。 类是静态内部类。类是一个非静态的内部类。两者之间的区别是,非静态内部类的实例被永久连接到的实例-你不能创建一个没有。不过,您可以独立创建对象。 中的代码,并且都可以访问x; 不允许使用其他代码。
问题内容: 当我发现它是一个接口时,我正在阅读接口。我不太了解什么是静态接口,它与常规接口有何不同? 这是接口的定义。此处的文档: Map.Entry 。 问题答案: 我对它不是内部接口的情况感到好奇。 所述改性剂只允许在嵌套类或接口。在您的示例中,嵌套在接口内部。 对于接口,修饰符实际上是可选的。对于接口来说,这种区别是没有意义的,因为它们不包含任何仍然可以访问外部接口的代码。
问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么呢 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。
问题内容: 什么时候嵌套类可行?我看到的最常见的优点是“共享范围”(跨类使用变量)。 这是否比仅将嵌套类放入其自己的文件中并通过构造函数传递参数更具吸引力/最佳实践少? 问题答案: 使用嵌套类的原因有很多,其中包括: 这是一种对仅在一个地方使用的类进行 逻辑分组 的方法。 它增加了 封装 。 嵌套类可以导致更具 可读性和可维护性的代码 。 子级到父级的连接更为简单,因为它 直观地说明 了每个类的变
问题内容: 编辑: 从Java 8开始,接口中现在允许使用静态方法。 例子如下: 当然这行不通。但是为什么不呢? 可能的问题之一是,当你致电时会发生什么: 在这种情况下,我认为它应该只调用一个空方法(即{})。所有子类都将被强制实现static方法,因此在调用static方法时它们都很好。那为什么不可能呢? 编辑:我想我正在寻找比“因为这就是Java的方式”更深的答案。 有特定的技术原因为什么不能