タイトルは申し訳ありませんが、おそらく一般的すぎます。
Javaによるアクションリスナーのチュートリアルの書き方をすでに読んでいて、この質問も読んでいますが、まだ疑問があります。同じアクションを複数回実行する必要がある場合、どのソリューションが最適か疑問に思いました。
同じものを再利用したいのですが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
が、それは好きではありません...デザインが貧弱なようです。それはもっと理にかなっています、おそらくコマンドパターンに従うのが最善です...私は最初にパッケージについて疑問を持っていました...私はすべてのリスナーを別々のパッケージに入れたいです(例えば
com.myapp.gui
、GUI要素とcom.myapp.gui.listeners
リスナーのために。しかし私が書いたときこれで私は選択の余地がないことに気づきました。それが理にかなっている唯一の場所は同じパッケージにある(パッケージプライベートでなければならないため)、たとえ注文のためにそれらをすべて別々に入れたいとしてもしかし、GUIが変更された場合でも、ほとんどのアクションリスナーは再利用できる可能性があるため、まだ疑問があります。同じパッケージに含めることをお勧めしますか?
btnMenu.addActionListener(MENU_ACTION_LISTENER);
別の質問:呼び出しとbtnMenu.addActionListener(new MenuActionListener());
(JVM、クラスのロード、クラスのコンパイル、各クラスが占有するメモリ、ガベージコレクションなど)の違いは何ですか?
助けてください、私は今とても混乱しています!:(