Java(匿名与否)内部类:使用它们是否合适?

Gui*_*ume 20 java inner-classes

在我的一些项目和一些书中据说使用内部类(匿名或不是静态或不静态) - 除了在某些限制条件下,如EventListeners或Runnables - 是最佳实践.他们甚至在我的第一个行业项目中都是"禁止".

这真的是最佳做法吗?为什么?

(我不得不说我经常使用它们......)

- 编辑---
我无法在所有这些答案中选择正确的答案:大部分都是正确的部分:我仍然会使用内部课程,但我会尽量少用它们!

Uri*_*Uri 27

在我看来,Java代码中90%的内部类是与单个类关联的实体,因此被"推入"作为内部类,或者因为Java不支持Lambdas而存在的匿名内部类.

我个人不喜欢看复杂的内部课程.它们增加了源文件的复杂性,它们使它更大,在调试和分析等方面处理它们很难.我喜欢将我的项目分成许多包,在这种情况下我可以使大多数实体成为顶级类仅限于包装.

这给我留下了必要的内部类 - 例如动作听众,虚假的"功能"编程等等.这些通常是匿名的,虽然我不是粉丝(在许多情况下会更喜欢Lambda),但我和他们住在一起但是不要不喜欢他们.

多年来我没有做过任何C#,但我想知道在引入Lambdas时内部类的流行程度或C#等价物的流行是否会被删除.

  • 作为参考,我必须提到**Java 8**引入了[**Lambda Expressions**](https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html). (4认同)

Mic*_*ers 17

清洁度.如果代码被分解为逻辑部分,而不是所有代码都存储在同一个文件中,则更容易理解代码.

也就是说,我不认为明智地使用内部类是不合适的.有时这些内部类只存在于一个目的,因此我可以将它们存在于使用它们的唯一文件中.但是,根据我的经验,这并没有发生太多.

  • 如果将代码分解为逻辑片段,则更容易理解代码,是的 - 但是在*my*book中,这意味着最好定义尽可能接近使用代码的内容,而不是随意将其拆分为自己的文件.;) (13认同)
  • 根据我的经验,只要你做一个内部课程,无论如何你都需要它在其他地方:) (2认同)
  • 内部类不排除你在它们所在的类之外使用它们.枚举是一个很好的例子,Enums通常用于单个类,使它成为一个公共静态,然后你有一个上下文,说明Enum应该在哪里使用.工厂模式是内部类生成实现的好地方,而不会污染包名称空间,只能在Factory对象控制的某些情况下实例化. (2认同)

fas*_*ava 6

在进行基于事件的编程时,特别是在swing中,匿名类很好用.


Cow*_*wan 5

是的,禁止内部阶级是一种有用的做法,因为找到一个禁止他们进入的地方是警告我不要在这里工作的好方法,因此可以保持我将来的理智。:)

正如gicappa所指出的那样,匿名内部类是Java最接近闭包的类,并且非常适合在将行为传递给方法的情况下使用(如果没有其他情况)。