Java中的静态嵌套类,为什么?

2022-08-31 05:50:25

我正在查看Java代码,并注意到它使用了静态嵌套类。LinkedListEntry

public class LinkedList<E> ... {
...

 private static class Entry<E> { ... }

}

使用静态嵌套类而不是普通内部类的原因是什么?

我能想到的唯一原因是,Entry无法访问实例变量,因此从OOP的角度来看,它具有更好的封装。

但我认为可能还有其他原因,也许是性能。它可能是什么?

小说我希望我的术语是正确的,我会称之为静态内部类,但我认为这是错误的:http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html


答案 1

您链接到的 Sun 页面在两者之间有一些关键区别:

嵌套类是其封闭类的成员。非静态嵌套类(内部类)有权访问封闭类的其他成员,即使它们被声明为 private。静态嵌套类无权访问封闭类的其他成员。

注: 静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是嵌套在另一个顶级类中的顶级类,以便于打包。

不需要是顶级类,因为它由 (还有一些其他接口也具有名为 的静态嵌套类,例如 - 相同的概念)。由于它不需要访问LinkedList的成员,因此它是静态的 - 这是一种更简洁的方法。LinkedList.EntryLinkedListEntryMap.Entry

正如Jon Skeet所指出的,我认为如果你使用嵌套类,一个更好的主意是从它是静态的开始,然后根据你的用法决定它是否真的需要是非静态的。


答案 2

在我看来,每当你看到一个内部类时,问题应该是相反的 - 它真的需要是一个内部类,具有额外的复杂性和对包含类的实例的隐式(而不是显式和更清晰的IMO)引用吗?

请注意,作为C#粉丝,我有偏见 - C#没有内在类的等效物,尽管它确实有嵌套类型。我不能说我错过了内部课程,:)


推荐