对不起,标题可能太泛泛。ActionListener最佳做法
我已经在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
接口的新类。
用于解决方案1实施例的代码:
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 ......我最初对包的一些疑问......我想有一个单独的包例如,对于GUI元素
com.myapp.gui
和com.myapp.gui.listeners
所有听众(听众,但是当我写下这些时,我意识到我没有选择:唯一有意义的地方是在同一个包中(因为他们必须是包私有的),即使为了我的命令,但我仍然有一些疑问,因为即使在GUI改变的情况下,大多数动作监听器也可以重用;将它放在同一个包中仍然是个不错的主意?
另一个问题:调用btnMenu.addActionListener(MENU_ACTION_LISTENER);
和btnMenu.addActionListener(new MenuActionListener());
(从JVM的角度讲,类加载,类编译,每个类占用的内存,垃圾回收等等)之间有什么区别?
请帮忙,我现在很困惑! :(
+1这也使您能够在没有多次调用的情况下同时更改“动作”所连接的所有按钮的文本,图标,启用状态和其他属性。另外,它可以附加到菜单项目等。 – Brian
+1000如果我可以...... ;-) –
@布莱恩非常好的评论。我复制粘贴它的答案,使其更加完整 – Robin