[英]Best way to implement actionPerformed?
在Java中,我们有两种方式来实现actionPerformed:
对于选项 1,很容易跟踪 actionPerformed 代码的位置,因为每个 class 只有一个方法。 我们可以轻松找到该方法,然后查看内部以找到我们正在寻找的代码。 但是,如果我们有很多动作监听器,可能会有太多的 if-else 子句。
对于选项 2,不容易找到 actionPerformed 代码的位置,因为它分散在 class 各处。 如果您有许多动作侦听器,则跟踪 actionPerformed 实例将更加困难。
我个人更喜欢选项 1,因为它更容易维护代码,甚至性能可能不如选项 2。
每种方法的优缺点是什么? 在选择如何实现 actionPerformed 时还应该考虑什么? 你更喜欢哪种方式?
编辑:
因此,根据下面 A. Lee 的建议,有第三个选项。 它是选项 1 和选项 2 的组合:使用匿名内部类,但将它们完全放在 class 中的一个位置。 我认为这是个好主意。
我认为 actionPerformed 方法中长长的 if-else 链很难看,原因有几个 - 您每次都进行不必要的检查以确定哪个是ActionEvent
的合适接收器代码,并且随着代码的增长,它变得越来越难以维护。
如果您希望将所有操作处理程序放在一个位置,请使用一个将您的 ActionListeners 绑定到控件的initializeActionListeners
方法。 或者将它们绑定在您初始化它们的位置,以便事件处理程序更接近您的小部件/控件本身,例如,
// not thread-safe
private JLabel getSomeLabel() {
if (someLabel == null) {
someLabel = new JLabel("Some label, huh");
someLabel.addActionListener(...)
}
return someLabel;
}
错误的选择:问题不是匿名类与一个长的大 if-else 构造(你可以很容易地在前者中使用后者)。 问题是是否有一个语义强大的 class (匿名与否),它只完成一项工作,是唯一一个完成它并且完全完成它的工作。 毕竟,我们在 OO 领域;-)
所以:严格禁止任何 if-then-else 结构。
我使用第三个选项,我编写了自己的 Manager,它通过注释直接将方法绑定到 JButtons。
我将它作为一个开源项目提供,您可以在https://github.com/MarkyVasconcelos/Towel/wiki/ActionManager上查看它
优点是您不需要实现任何 ActionListener,也不需要匿名内部类。
所有操作都在您的 class 的方法中。
在大多数情况下,没有太大区别,建议一个优于另一个。
我会说:如果情况相似,请将它们放在一起,但只是从那里调用适当的方法:
public void actionPerformed (ActionEvent e)
{
String cmd = e.getActionCommand ();
if (cmd.equals (cmdNextPage)) nextPage ();
else if (cmd.equals (cmdLastPage)) lastPage ();
else if (cmd.equals (cmdOk)) ok ();
// ... and so on
这样,您可以轻松地调用方法,独立于事件,可能来自测试框架,或者用于某些撤消/重放。 共同的模式是显而易见的。
在极少数情况下,您可能对注销单个事件和独立来源感兴趣。 然后,每个 ActionEvent 的单个侦听器似乎更适合。
从纯粹的 OOP 的角度来看,我认为每个按钮(例如)单个侦听器更直接,并且从不成熟的优化愿望来看,我对 20 或 40 个 ActionListener 感到不舒服,但在我理性的时候,我不相信 40 个 ActionListener 会产生可衡量的影响。 但是它们会弄乱你的文件系统,你的 IDE 浏览器,所以我想最终有一个合理的理由,将监听器的数量保持在低水平。
一个普通的监听器在按钮工厂中很容易使用:
private void addButton (JPanel jp, String cmd, String ttt)
{
JButton jb = new JButton (cmd);
jb.setToolTipText (ttt);
jp.add (jb);
jb.addActionListener (this);
buttonlist.add (jb);
}
/** @return a Panel with Action-Buttons. */
private JPanel createControlPanel ()
{
JPanel m = new JPanel ();
m.setLayout (new BoxLayout (m, BoxLayout.Y_AXIS));
JPanel jpc = new JPanel ();
jpc.setLayout (new FlowLayout ());
buttonlist = new ArrayList <JButton> ();
addButton (jpc, cmdLastPage, "last page");
addButton (jpc, cmdNextPage, "next page");
addButton (jpc, cmdOk, "save");
addButton (jpc, cmdEsc, "exit");
在哪里添加新按钮以及如何添加非常简单明了。 我觉得它非常易于维护。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.