Java—ActionListeners、KeyListeners等是否应该始终在内部类中声明?

Java—ActionListeners、KeyListeners等是否应该始终在内部类中声明?,java,listener,inner-classes,Java,Listener,Inner Classes,在我看过的所有Java源代码示例中,侦听器总是在内部类中声明的 为什么-为什么要这样编码类,而不是将侦听器放在各自独立的*.java文件\类中 为听众提供单独的课程会被认为是一个糟糕的设计吗 如果这不是一个糟糕的设计\可以解雇的冒犯,那么有人可以发布一个简短的示例来演示如何实现这一点吗 谢谢你的阅读 编辑\更新-10.8.2010: 感谢所有花时间回复的人。要考虑很多有意义的问题。 阅读了所有答案后,我认为除非有很好的理由,否则将侦听器声明为内部类会更好、更容易 很抱歉,我没有早点回到这个问题上

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

为什么-为什么要这样编码类,而不是将侦听器放在各自独立的*.java文件\类中

为听众提供单独的课程会被认为是一个糟糕的设计吗

如果这不是一个糟糕的设计\可以解雇的冒犯,那么有人可以发布一个简短的示例来演示如何实现这一点吗

谢谢你的阅读

编辑\更新-10.8.2010: 感谢所有花时间回复的人。要考虑很多有意义的问题。 阅读了所有答案后,我认为除非有很好的理由,否则将侦听器声明为内部类会更好、更容易

很抱歉,我没有早点回到这个问题上来,但我并没有那么多时间来编写代码:-(


愉快的编码。

如果您在示例中看到过它们,可能会让它看起来更简单。大多数人可能会告诉您只使用当前类并实现侦听器。哪一个看起来更简单:在两个文件中创建两个类,在主类中使用嵌套的侦听器,还是将主类作为侦听器?(提示:这不是第一次)

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

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


简而言之:保持它们嵌套或实现,除非必要,否则不要将它们分开。然而,必要的情况是使用内部类的理由很少:

  • 避免向包命名空间添加额外的顶级类
  • 将代码封装在本地(例如,在需要事件处理行为的组件内)
  • 静态内部类在不需要访问封闭类的字段时工作良好
使用顶级类的可能原因:

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

简言之:通常首选内部类,但如果您有充分的理由,那么创建顶级类是完全明智的。

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

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


一个内部类是当前类的本地类,如果这些类不需要在其他地方使用,这是很好的。在一本书中的一个例子中,它给了类一个名称,这样就可以很容易地从散文中引用它


侦听器的典型用法是它们只在一个地方使用,为此目的,匿名内部类是完美的通常会有一个对应的适配器,其中包含所有内容的空实现,然后可以根据需要重写。请参阅MouseAdapter。

不,我认为它们不应该总是内部类。这意味着UI本身总是知道如何最好地选择侦听器

另一种看待它的方式可能是监听器被注入到UI中。它们可能是由控制器提供的,控制器实例化UI并告诉它如何对UI事件做出反应

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

讨论了不同方式的权衡


基本的答案是,程序中的GUI代码通常是非常相互交织的,并且通常不能在程序之间共享允许您构造GUI代码,以便在接受GUI高度耦合的同时可以对其进行维护。

感谢您的链接,TofuBeer。
JButton jb = new JButton("ok");
jb.addActionListener(new