一尘不染

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

java

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

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

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

}

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

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

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

注意。我希望我的术语正确,可以将其称为静态内部类,但是我认为这是错误的:http : //java.sun.com/docs/books/tutorial/java/javaOO/nested.html


阅读 336

收藏
2020-03-13

共1个答案

一尘不染

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

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

注意:静态嵌套类与它的外部类(和其他类)的实例成员进行交互,就像其他任何顶级类一样。实际上,静态嵌套类在行为上是顶级类,为了包装方便,该顶级类已嵌套在另一个顶级类中。

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

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

2020-03-13