Java - 应该在内部类中声明ActionListeners,KeyListeners等等吗?

时间:2010-08-08 22:26:55

标签: java listener inner-classes

在我看过的所有Java源代码示例中,侦听器总是在内部类中声明。

为什么 - 这样编写类的原因是什么,而不是将侦听器放在他们自己的单独的* .java文件\ class中?

为听众设置单独的课程会被视为糟糕的设计吗?

如果这不是一个糟糕的设计\麻醉的进攻,有人可以发一个简短的例子来证明如何实现这个吗?

感谢阅读。

编辑\更新 - 10.8.2010: 感谢所有花时间回复的人。需要考虑很多有见识的要点。 阅读完所有答案之后,我认为除非有充分的理由不这样做,否则将听众声明为内部类更好更容易。

抱歉不早点回到这个问题,但我并不总是有足够的时间进行编码: - (

快乐的编码。

6 个答案:

答案 0 :(得分:6)

使用内部类的充分理由:

  • 避免在您的包名称空间中添加额外的顶级类
  • 保持代码在本地封装(例如,在需要事件处理行为的组件内)
  • 静态内部类在不需要访问封闭类的字段时运行良好

使用顶级课程的可能原因:

  • 您有一种特殊类型的侦听器,您期望外部程序包使用它或构成API的一部分(例如,在Java类库本身中)
  • 监听器在很多地方使用,并且在逻辑上不是特定于许多可能的封闭类中的任何一个

简而言之:内部课程通常是首选,但如果你有充分的理由,那么创建顶级课程是完全合理的。

答案 1 :(得分:1)

不,我不认为他们应该永远是内部阶级。这意味着UI本身总是知道如何做出最佳的听众选择。

另一种看待它的方法可能是将Listener注入UI。也许它们是由Controller提供的,它实例化UI并告诉它如何对UI事件作出反应。

我认为这更像是对世界的依赖注入观点。它可能有重要的优势。

答案 2 :(得分:1)

This answer讨论了不同方式的权衡。

基本答案是程序中的GUI代码通常相互交织,通常不能在程序之间共享。做内部类(特别是如果你采用我在上面链接的答案中建议的方式),你可以构建GUI代码,使其可以维护,同时接受GUI高度耦合。

答案 3 :(得分:0)

如果你在例子中看过它们,可能会让它看起来更容易。大多数人可能会告诉你只需要当前的类并实现监听器。哪一个看起来更容易:在2个文件中创建2个类,在主类中使用嵌套侦听器,或者只将主类作为侦听器? (提示:它不是第一个)

我很懒,只有一个主类实现ActionListener接口。这当然只适用于非常简单的GUI。对于较大的项目,您应该将它们分开。

至于将Listener放在一个单独的类中,请问自己:其他类是否需要使用它?只有当其他人需要使用它们时,类才应该在他们自己的文件中。分享听众并不是最好的想法,除非你有一些奇怪的布局,其中按钮做同样的事情,但每个班级的排列方式不同。

简而言之:除非必要,否则请将它们嵌套或实施,而不是分开。然而,一个必要的案例将是很少和很远的

答案 4 :(得分:0)

您当然可以在单独的.java文件中的单独类文件中实现侦听器。 Java 1.1引入了匿名类和内部类的想法以及几年前的awt事件重新设计。原因是很多时候,您编写的侦听器需要更新和/或读取包含生成事件的对象的类中的字段。从非内部/匿名类中引用这些字段非常麻烦。

一旦你更多地使用匿名类,你会发现它确实使得以后编写和维护更简单。无论如何,现代IDE甚至会为您生成大部分代码。例如,键入IntelliJ IDEA中的这两行并按ctrl-shift-space。 IntellJ将插入一个匿名类,该类包含addActionListener()指定的接口的所有方法。

JButton jb = new JButton("ok");
jb.addActionListener(new 

答案 5 :(得分:0)

内部类是当前类的本地类,如果不需要在其他地方使用它们,这很好。在书中的一个例子中,它为类提供了一个名称,这使得可以从散文中轻松地引用它。

侦听器的典型用法是它们仅在一个地方使用,为此目的,匿名内部类是完美的。对于具有大量方法的接口(如MouseListeners),通常会有一个对应的适配器,其中包含所有内容的空实现,然后可以根据需要覆盖它们。请参阅MouseAdapter。