在我看过的所有Java源代码示例中,侦听器总是在内部类中声明。
为什么 - 这样编写类的原因是什么,而不是将侦听器放在他们自己的单独的* .java文件\ class中?
为听众设置单独的课程会被视为糟糕的设计吗?
如果这不是一个糟糕的设计\麻醉的进攻,有人可以发一个简短的例子来证明如何实现这个吗?
感谢阅读。
编辑\更新 - 10.8.2010: 感谢所有花时间回复的人。需要考虑很多有见识的要点。 阅读完所有答案之后,我认为除非有充分的理由不这样做,否则将听众声明为内部类更好更容易。
抱歉不早点回到这个问题,但我并不总是有足够的时间进行编码: - (
快乐的编码。
答案 0 :(得分:6)
使用内部类的充分理由:
使用顶级课程的可能原因:
简而言之:内部课程通常是首选,但如果你有充分的理由,那么创建顶级课程是完全合理的。
答案 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。