3

ダイアログがあり、[新規]、[保存]、[削除]、[キャンセル] という 4 つのボタンがあります。次に、これらのそれぞれがアクションを実行する必要があります。そのため、を実装する別のクラスを定義しましたActionListener。このクラスを使用して、各ボタン アクションを実行しました。

public class MyClass implements ActionListener {
  public void actionPerformed(ActionEvent e) { 
   if(e.getActionCommand().toString() == "OK") {
        // Code
   } else if( .. ){

   }
  }
}

私が行ったことは、同じ機能を実行するために使用した内部クラスを定義したことです。しかし、私が得ていなかったのは、別のクラスを書くのがベストプラクティスなのか、それともインナークラスを使うのがベストなのかということです。明日、誰かがこのクラスを使用してアクションを実行できるように、公開クラスに書き込むことを提案されました。そこで、以下の質問があります。

  1. 機能がどのオブジェクトからも呼び出されない場合 (これは言えません)、内部クラスに記述できますか? また

  2. そのダイアログのアクションを実行する内部クラスを常に記述することは良い習慣ですか?

4

3 に答える 3

6

GUI リスナーの内部クラスの定義について話すとき、私はすぐに匿名クラスを使用して仕事をすることを考えます。

newButton.addActionListener(
    new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            // do the work for a button press
        }
    });      

// similarly for save, cancel, delete buttons:
saveButton.addActionListener(
    new ActionListener()
    {
        // ...

これはよく見かけますが、私はこれを自分のコードでよく使用します。

どちらを使用するかは、コードの構造によって異なります。たとえば、次のようになります。

  • 各リスナーが実行する必要がある作業量
  • ハンドラー間で共有されるコードの量

各ハンドラーが短い場合 (たとえば、メソッド呼び出しが 1 つだけで、実際の作業はすべて別のクラス メソッド内で処理される場合)、この方法で匿名クラスを使用します。残念ながら Java では、オブジェクトを定義してコールバック メソッドを使用する必要があります。

また、個人の好みとコーディング スタイルの問題でもあります。

ただし、例のように GUI ハンドラーの新しいトップレベル クラスを作成することはめったにありません。各ボタンに同じクラスを使用するようにクラスを分離したとしても、クラス ファイル内でクラスを定義します。非パブリックのトップレベル クラスまたは内部 (非匿名) クラスとしてボタンを制御します。GUI コールバックの複雑さが別のクラスに値するほど大きくなった場合、リファクタリングする場所を探し始めます。

于 2012-10-16T14:53:53.950 に答える
6

これらの質問に対する一般的な答えはありません。コードactionPerformed()が 1 行の場合、通常、クラス ファイル全体を作成するのはやり過ぎです。

コードがより複雑な場合は、再利用するのに適しているかもしれませんが、コードが大きくなるにつれて、より具体的になります (そのため、再利用できなくなります)。

このアプローチに従うようにしてください:

  • 互いに独立した単純なブロックからアプリケーションを構築します。
  • ブロックを接続するコードを記述して、アプリケーションを構成します。

したがって、あなたの場合、作業を行うヘルパーメソッドを使用できます。それらをSwingActionラップします。これにより、あらゆる種類のボタンやメニューで使用できます。

アクションが本当に単純になるように、できるだけ多くの作業をヘルパーに移してみてください。疑問がある場合は、次のことを自問してください。このコードは作業の一部ですか? 誰もがこれを行う必要がありますか?

はいの場合、コードは作業/ヘルパー クラスに入る必要があります。

UI 関連のチェック (表示/有効化)、変換 (文字列から数値へ)、検証などの場合は、アクションに入る必要があります。

于 2012-10-16T14:54:11.970 に答える
2
于 2012-10-16T15:59:03.327 に答える