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