为什么要使用私有静态内部类?这是否与静态内部类的目的相悖?

5
我已经阅读了所有关于静态内部类的文章,从中我明白了以下内容:
- 静态内部类的实例可以在之前不创建外部类的情况下创建。这是静态和非静态内部类之间的主要区别。
但是,这些文章都没有回答这个问题:
如果静态内部类的目的是可以在外部类不存在的情况下创建它,为什么你要有一个私有的静态内部类呢?
例如,Java的LinkedList实现包含了`private static class Node`。如果我们尝试实例化`LinkedList.Node`,它将不起作用,因为它是私有的。而且我也不明白为什么你想要创建一个没有LinkedList的Node,因为你只需要使用LinkedList的add()接口。所以这个内部类不能是非静态的吗?
对我来说,内部类的私有和静态似乎是矛盾的,如果你想同时拥有私有和静态,那就很奇怪了。所以,能否请有人解释一下我错过了什么?
谢谢!
1个回答

10
请记住,非静态嵌套类(“内部类”)实例具有对其包含实例的引用。这不是免费的。如果您不需要它,就不应该拥有它。
LinkedList是一个很好的例子,说明为什么你会有一个静态嵌套类:LinkedList需要多个LinkedList.Node的实例,而它不需要这些实例引用列表本身。那将是无意义的开销。因此,Node类是静态的,以避免这些反向引用到列表。它也是私有的,因为它只供LinkedList内部使用。

关于术语的说明:Java 中没有“静态内部类”。如果它是 static,那么它不是内部类,而是静态嵌套类。更多信息请参见教程


我明白了!谢谢!如果我理解正确的话,我提到静态嵌套类的原因只是其中之一,另一个原因是它不包括对外部类的引用,这意味着它占用更少的空间。所以我们选择使用静态LinkedList示例不是为了可以在没有LinkedList的情况下创建Node,而是为了使节点不包含开销。我们将Node放在LinkedList中是为了打包目的。这样对吗? - Music Map
@MusicMap:是的。只有当内部类中的代码需要访问其所属的包含类实例时,才使用内部类。如果嵌套类中的代码不需要访问包含实例,则应改用静态嵌套类。 - T.J. Crowder
非常感谢,那是一次很好的解释。 - Music Map

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接