在Java中使用静态嵌套类的缺点是什么?

7
在我所阅读的文本中,作者展示了一个使用静态嵌套类的代码示例,并且评论说如果这个静态嵌套类“让你不舒服”,你可以将其写成一个单独的类。
为什么会让你不舒服呢?在Java中使用静态嵌套类有什么缺点吗?

我不知道为什么他们关闭了这个问题,尽管没有人回答它。很可能有人无法理解某个作者的观点并将其作为一个问题发布在这里。 - Arham
请参见https://dev59.com/uZPfa4cB1Zd3GeqPDHDe。 - Raedwald
4个回答

5
优点: 作者所指的是静态嵌套类编译成了一个完全独立的 .class 文件,不同于包含它的外部类。因此,如果它困扰你、使事情变得更加复杂或让你感到困惑,最好将其单独使用。 静态嵌套类不依赖外部类实例,可以独立运行。甚至可以在静态嵌套类中编写 main 函数并直接调用。这样做的好处是可以在运行时创建较少的对象,而其他类型的嵌套类则不具备此优势。 缺点: 我唯一能想到的缺点是静态嵌套类可以访问外部类的 protected 和 private 成员。 假设您有一个类 X 和一个类 Y。为了让 Y 访问 X 的私有成员而不是其他人,将 Y 设为 X 的内部类是有帮助的。这通过将它们分组在一起来满足封装的要求。
但是,静态嵌套类在访问外部类的成员时不关心外部类的访问修饰符。由于它可以独立存在,因此它可以允许来自外部世界的人与外部类的私有成员交往,并因此破坏封装。
将静态嵌套类视为另一个可以访问外部类的私有和受保护成员而不使用外部类的上下文/实例并自由地将它们出售给外部世界进行恶意使用的顶级类。
要了解嵌套类或 Java 中的任何内容,建议先查阅 Oracle 文档,然后再读任何书籍,http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

1
每个类,即使是匿名类,都会编译成一个单独的.class文件。 - Marko Topolnik
这就是我想知道的事情。考虑到我刚刚开始,你能给我举个例子,说明这会带来什么不利影响吗? - e.inglewood
@MarkoTopolnik,我所说的“独立”是指它不依赖于外部类实例,可以自行运行。甚至可以在静态嵌套类中编写main函数并直接调用。这也是一个好处,因为在运行时创建的对象数量较少,而其他类型的嵌套类则不是这种情况。 - Arham
@e.inglewood 更新了我的答案,请查看。 - Arham

2
一个嵌套类可能会使初学者感到困惑,因为他不理解它。作者小心翼翼地避免混淆这样的初学者,并为了安慰他,提供了一个简单的顶层类。另一方面,由于嵌套类很可能在内容上非常简化,在实例中使用嵌套类可能更加合适,同时将所有相关内容放置在一个地方有助于提高可读性。

是的,这个例子很简单,只有两个实例变量。所以没有性能或健壮性方面的考虑吗? - e.inglewood
绝对没有。编译后,差异完全消失了。此外,使用嵌套类可以实现更好的访问控制,例如将其设置为“private”。这样可以使其使用范围更清晰明确。 - Marko Topolnik
太好了。谢谢你为我澄清这个问题。 - e.inglewood

1
一个静态嵌套类不能直接引用其封闭类中定义的实例变量或方法——它只能通过对象引用来使用它们。
静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。静态嵌套类在行为上是一个已嵌套在另一个顶级类中的顶级类。

0

谢谢您提供的链接。它提到了使用静态嵌套类的一个优点,但没有提到任何缺点。 - e.inglewood

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