對不起,標題可能太泛泛。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