Java中的静态嵌套类,为什么?
我正在查看LinkedList
的Java代码,并注意到它使用了静态嵌套类Entry
。
public class LinkedList<E> ... {
...
private static class Entry<E> { ... }
}
什么是使用静态嵌套类,而不是一个正常的内部类的原因是什么?
我能想到的唯一原因是Entry无法访问实例变量,所以从OOP的角度来看,它具有更好的封装性。
但我认为可能还有其他原因,或许是表现。 它可能是什么?
注意。 我希望我的条款正确,我将其称为静态内部类,但我认为这是错误的:http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html
您链接到的Sun页面在两者之间有一些主要区别:
嵌套类是其封闭类的成员。 非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。 静态嵌套类不能访问封闭类的其他成员。
...
注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。 实际上,为了方便打包,静态嵌套类在行为上是嵌套在另一个顶级类中的顶级类。
LinkedList.Entry
不需要为顶级类,因为它仅由LinkedList
(还有一些其他接口也具有名为Entry
静态嵌套类,例如Map.Entry
- 同一个概念)。 因为它不需要访问LinkedList的成员,所以它是静态的 - 这是一个更清洁的方法。
正如Jon Skeet所指出的那样,我认为如果你使用嵌套类是一个更好的想法,那么首先它是静态的,然后根据你的使用情况决定它是否真的需要非静态。
在我看来,当你看到一个内部类时,这个问题应该是相反的 - 它是否真的需要成为一个内部类,具有额外的复杂性以及对实例的隐式(而不是明确和更清晰的IMO)引用包含类的?
请注意,我偏爱C#粉丝 - C#没有内部类的等价物,尽管它有嵌套类型。 我不能说我已经错过了内部课程:)
这里需要考虑的非明显的内存保留问题。 由于非静态内部类保持对其“外部”类的隐式引用,因此如果内部类的实例被强引用,那么外部实例也会被强引用。 当外部类不是垃圾收集时,这可能会导致一些头部划伤,即使看起来没有任何引用它。
链接地址: http://www.djcxy.com/p/91997.html上一篇: Static nested class in Java, why?
下一篇: Why can I access the private members of an enclosing class reference