为什么要使用嵌套类?

21

何时嵌套类是可行的? 在我看来,最常见的好处是“共享作用域”(跨类使用变量)。

与将嵌套类放入自己的文件中并通过构造函数传递参数相比,这是否不太有吸引力/不是最佳实践?


除了作用域优势之外,只有内部类可以是静态的,并且可以用于存储实用方法。 - Anirudh Ramanathan
3
每当我需要在类中使用数据结构,但又不想公开这个数据结构时,我会选择使用它。这是否是最佳实践,我不知道,但对我来说效果良好。据我所了解,这种做法在Java的默认数据结构如LinkedList等中也有一定程度的应用。 - atomman
有趣的是-我一直认为嵌套类是不可取的,就像作弊或者hack的一种方式,会让代码不易读。看来我错了。 - Dane Balia
1
@DaneBalia 我仍然认为它们是这样的。大多数情况下,人们会被诱惑使用内部类来处理问题,但应该使用包来代替。 - AJMansfield
4个回答

20

使用嵌套类有几个原因,其中包括:

  1. 它是一种将只在一个地方使用的类逻辑分组的方式。

  2. 它增加了封装性

  3. 嵌套类可以使代码更加易读易维护

  4. 子类到父类的连接更简单,因为它直观地说明了每个类的变量和方法。


此外,还可以导出比封闭类提供的更深层次的功能,例如跨集合进行迭代。 - OldCurmudgeon
而且调试更容易完成。 - dd619
我对第二个原因有些怀疑。对于封装,所有语言都有访问说明符,如private、public、protected等。我很难看出嵌套类的概念是增加封装的一种方式。即使不嵌套,您也可以控制类的可访问性。如果我错了,请指正我。 - RBT
@dd619,嵌套如何帮助更轻松地进行调试?您能否再多解释一些以增加清晰度?当您调用嵌套类的API时,控制流仍然会跳转到这里和那里。不是吗? - RBT
@RBT:抱歉回复晚了。嵌套类使得调试代码更加容易,因为调试控制流和监视器仍然在父类中,并且嵌套类的上下文显示当前调试器进程中的所有变量、监视器、表达式和线程(例如,我们可以轻松比较从父类到嵌套类的参数值的变化)。 - dd619

1
除了之前提到的好处外,另一个好处是:
嵌套类还可以帮助您实现多重实现继承(参考:《Java编程思想》,第369页-“为什么要使用内部类”一节)。据我所知,在Java中没有其他方法可以实现多重实现继承。

1

据我所知,嵌套类的使用情况有以下几种:

第一种情况是当我们发现一个对象(OBJ1)与另一个对象(OBJ2)密切相关时,且我们不能创建第一个对象(OBJ1)而不使用第二个对象(OBJ2)。例如,如果我们有一个员工对象,其中一个关联对象是工资,我们就不能单独创建工资对象,因为没有员工对象我们不知道给谁发薪水。
如果我的理解有误,请提供您的反馈。

第二种情况是在使用映射或嵌套映射时,我们可以使用嵌套类来消除嵌套映射,使代码更易于理解。

第三种情况是当我们想要将数据发送到客户端时,我们可以将其放在一个单独的对象中并发送所有数据:)

最后一种情况是当我们需要定义外部类的组件或者我们想要定义适配器时。


0

当我需要将一组相关字段传递到方法中并在类内的几个方法调用中操作相同的数据组时,我发现私有静态类非常有用。类似于LinkedList.Node类,它不会暴露给外部,而是用于将链接分组为单个单元。


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