ActionListener最佳实践

对不起标题,可能太通用了。

我已经阅读了Java 如何编写动作监听器教程,我已经阅读了这个问题 ,但我仍有一些疑问:当我不得不多次执行相同的动作时,我想知道哪种解决方案是最好的。

我想重用相同的ActionListener ,但我不确定如何以最好的方式实现这一点(在术语方面:代码可读性,代码可持续性,性能和代码风格)。

首先是“标准”代码(如果我不打算重用动作监听器,我将使用它):

 btnMenu.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { Navigator.showMenu(); } } ); 

这样我就无法重用任何obv,因为它是一个匿名的内部类……

现在,我可以想到以下解决方案:

  1. 在字段中存储匿名内部类的引用(很可能是static final );
  2. 编写一个实现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()); 

我对这两种解决方案都有些怀疑:

  1. 在哪里存储对匿名动作侦听器的引用? 我可以有一种实用程序类(例如ActionListenersUtil ),其中存储我想在static final字段中重用的所有动作侦听器,但我不喜欢它……在我看来设计很糟糕。

  2. 它更有意义,可能最好遵循命令模式 …我最初对包有一些疑问…我想让所有的监听器都在一个单独的包中(例如com.myapp.gui用于gui元素和com.myapp.gui.listeners for listeners。但是当我写下来时,我意识到我别无选择:唯一有意义的地方是在同一个包中(因为它们必须是包私有的),即使是为了我希望将它们全部放在一个单独的包中。我仍然有一些疑问,因为即使在GUI更改的情况下,大多数动作监听器也可以重复使用;将它放在同一个包中仍然是个好主意?

另一个问题:调用btnMenu.addActionListener(MENU_ACTION_LISTENER);之间的区别是什么btnMenu.addActionListener(MENU_ACTION_LISTENER);btnMenu.addActionListener(new MenuActionListener()); (根据JVM,类加载,类编译,每个类占用的内存,垃圾收集等)?

请帮忙,我现在很困惑! 🙁

最好的方法是创建一个Action而不是ActionListener如果你必须将它附加到按钮,菜单…… ActionJButton的模型,该模型旨在共享

这也使您能够在没有多次调用的情况下同时更改Action所连接的所有按钮的文本,图标,启用状态和其他属性。 另外,它可以附加到菜单项等。

要创建一个Action您不必从头开始。 AbstractAction是一个很好的起点。 Swing Action教程也是一本很好的读物。