【发布时间】:2014-06-01 04:37:57
【问题描述】:
抱歉标题,可能太笼统了。
我已经阅读了 Java 的 How to Write an Action Listener 教程和 this question,但我仍然有一些疑问:我想知道当我必须多次执行相同的操作时哪种解决方案是最好的。
我想重用相同的 ActionListener,但我不确定如何以最佳方式实现这一点(从代码可读性、代码可维护性、性能和代码风格的角度来说)。
首先是“标准”代码(如果我不打算重用动作监听器,我会使用它):
btnMenu.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
);
这样我就不能重用任何 obv,因为它是一个匿名内部类...
现在,我可以想到以下解决方案:
- 将匿名内部类的引用存储在字段中(很可能是
static final); - 编写一个实现
ActionListener接口的新类。
方案一的示例代码:
public static final MENU_ACTION_LISTENER = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
};
btnMenu.addActionListener(MENU_ACTION_LISTENER);
解决方案2的示例代码:
// package-private, only GUI-package classes should be able to use it.
// most likely I won't ever need to subclass it, so why not making it final?
final class MenuActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
// now, wherever I need to use it:
btnMenu.addActionListener(new MenuActionListener());
我对这两种解决方案都有一些疑问:
-
在哪里存储对匿名操作侦听器的引用?我可以有一种实用程序类(例如
ActionListenersUtil),其中存储我想在static final字段中重用的所有动作侦听器,但我不喜欢它......在我看来设计很糟糕。 这更有意义,可能最好遵循Command Pattern...我最初对这些包有些怀疑...我希望将所有听众放在一个单独的包中(例如
com.myapp.guifor gui 元素和com.myapp.gui.listeners供听众使用。但是当我写下来时,我意识到我别无选择:唯一有意义的地方是在同一个包中(因为它们必须是包私有的),即使为了订单我想把它们都放在一个单独的包里。 不过我仍然有些怀疑,因为即使 GUI 发生变化,大多数动作侦听器也可能是可重用的;将它放在同一个包中仍然是个好主意吗?
另一个问题:调用btnMenu.addActionListener(MENU_ACTION_LISTENER);和btnMenu.addActionListener(new MenuActionListener());有什么区别(从JVM、类加载、类编译、每个类占用的内存、垃圾回收等方面讲)?
请帮忙,我现在很困惑! :(
【问题讨论】:
标签: java swing package actionlistener