4

私は Java でゲームを開発しようとしています。多くのリスナー (アクション、キー、マウスなど) があります。

私の質問は、リスナーを実装するための望ましい方法は何ですか。

方法 1:

this.addActionListener(new ActionListener() {
   // Overide methods go here
});

方法 2:

ActionListener を実装する新しいクラス (または複数のクラス) を作成し、さまざまなゲーム コンポーネント (ボタン、動き、その他 ActionListener が必要なもの) のメソッドを持ちます。

だから、例えば。私がボタンを作っているなら、そうする方が良いですか

JButton button = new JButton();
button.addActionListener(new ActionListener() {

});

また

JButton button = new JButton();
button.addActionListener(new MyActionListener());

// MyActionListener
class MyActionListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        Object objectPressed = e.getSource();
        if(objectPressed.equals(button) {
          System.out.println("Hello World");
        }
    }
}

どちらの方法にも利点があります。方法 1 ではそのオブジェクトに何が起こっているかを直接確認できますが、方法 2 ではすべてのコンポーネントを確認できます。

では、大規模なアプリケーションを開発する場合、すべてのリスナーを個別のクラスに配置するのと、方法 1 を使用するのとでは、どちらが保守しやすいでしょうか?

4

5 に答える 5

3

個人的には、「if」チェックを行うリスナーよりも多くのリスナーを好みます。それらを個別に変更できるようになります。

そのコードを UI 内に埋め込みます。それらを個別のクラスとして記述し、コンストラクターまたは DI ファクトリーを使用して依存関係として注入します。

コンストラクター注入:

public class YourPanel extends JPanel {
    private JButton button;

    public YourPanel(ActionListener buttonListener) {
        this.button = new JButton("Do It");
        this.button.addActionListener(buttonListener);
    }
}
于 2013-06-01T23:47:56.540 に答える
2

まず、用語。どちらの場合もクラスを定義していますが、最初の場合は匿名内部クラスと呼ばれます。のようなファイルが見つかりますMyClass$1.java

その意味で、MY(他は異なる場合があります)ルールは

1) 匿名の内部クラスは、再利用されない単純なアクションにのみ使用してください。他のすべてについては、「通常の」クラスを使用してください。

2) コンポーネントは、意味がある場合にのみ再利用してください。意味が大きく異なる 2 つのボタンがある場合は、同じリスナーを再利用しようとしないでください。いくつか作成します。たとえば、2 つのボタン (インクリメントとデクリメント) がある場合、操作は非常に似ているため、同じクラスを再利用できます。このようなボタンに複数の値がある場合は、コンストラクターで変更するオブジェクトを渡すクラスを再利用します。ただし、値をインクリメントするボタンと「ラウンド開始」ボタンを混在させないでください。


アップデート:

ちなみに、あなたが言うとき:

どちらの方法にも利点があります。方法 1 ではそのオブジェクトに何が起こっているかを直接確認できますが、方法 2 ではすべてのコンポーネントを確認できます。

すべてのコンポーネントを表示することは利点のように見えるかもしれませんが、すべてのクラスが他のすべてを変更できる場合、ロジックをカプセル化することはより困難になります。カプセル化は余分な作業を意味しますが、最終的にはよりメンテナンスしやすい製品が得られます。これは重要なことです。

于 2013-06-01T23:50:13.423 に答える
0

また、私が取り組んでいる swingobjects と呼ばれるこのスイング フレームワークもご覧ください。

https://github.com/Sethuraman/swingobjects

FrameFactory クラスを使用して Jframe を作成する場合、swingobjects は、フレームで宣言したすべてのウィジェットに対して GlobalListener を登録します。これにより、フレーム内のメソッドを次のような注釈でマークすることができます。

@Action("<action name or button text>")
public void performAction(ActionEvent evt){
....
}

GlobalListener は、リフレクションを介してこのメ​​ソッドを呼び出します。つまり、if ブロックを記述したり、匿名の内部クラスを作成したりする必要はありません。すべてが透過的に処理されます。フレームワークを見てみましょう...

于 2013-06-02T04:19:48.203 に答える