[英]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.