9

SCJPブックのメソッドローカル内部クラスの章を読んだばかりですが、それらの実際の使用法を考えるのに本当に苦労しています。

私は常に、メソッドはできるだけ小さく、タスクに固有である必要があるという印象を受けてきました(Orthogonality IIRC)。したがって、最も単純な内部クラスを導入すると、重くて扱いにくいメソッドが作成されます。

誰かがメソッドローカル内部クラスの良い実用的な使用法を提案できますか?これまでのところ、日常のコーディングではなく、試験に合格するためだけにそれらを理解する必要があるように感じます。

乾杯

4

6 に答える 6

12

ほとんどの場合(アクションリスナー、ランナブルなど)、メソッドローカルの名前付きクラスの代わりに匿名クラスを使用します。

ただし、名前付きクラスで実行できることと匿名クラスで実行できないことが1つあります。それは、複数のインターフェイスを実装すること、またはクラスとインターフェイスを拡張することです。また、このクラスの複数のオブジェクトを(ループを使用せずに)作成できます。

于 2011-04-04T19:54:34.557 に答える
4

より良いカプセル化が利点だと思います。

于 2011-04-04T19:43:57.177 に答える
2

メソッドローカル内部クラスは、「機能的な」操作を実行しようとしている場合、または後で呼び出されるようにコードを別のオブジェクトに渡そうとしている場合に役立ちます。ほとんどの場合、このようなクラスは1回だけ呼び出されるか使用されるため、別の場所で定義して、読者にそれを探すように強制する必要はありません。Javaの将来のバージョンでは、これらのタイプの内部クラスのほとんどのユースケースが「クロージャ」に置き換えられる可能性があります。

一般的なケースは、他のメソッドを呼び出すイベントリスナーを作成している場合、または新しいスレッドを開始している場合です。

于 2011-04-04T19:45:22.070 に答える
1

ローカルクラスを使用すると、親クラスからロジックを取り出してオブジェクト化できます。これにより、機能が属していない場所から機能が削除され、独自のクラスに配置されます。しかし、この新しいオブジェクトが短時間だけ必要であり、コードの単一ブロックの期間だけ必要な場合はどうなるでしょうか。さて、それはローカルクラスが適合するところです。

于 2011-04-04T19:43:15.300 に答える
0

Runnableスレッドに渡された実装について考えます:

Thread t = new Thread(new Runnable() {
   void run() {
      ...
    }
});

これは匿名クラスであり、匿名クラスも内部にあります。

于 2011-04-04T19:50:02.937 に答える
0

ローカルクラス(メソッドローカル内部クラス)はめったに使用されません。メソッド内で繰り返し機能が必要な場合や、クラスレベルのメソッドを作成する必要がない場合(この機能はメソッド外では必要ない場合があるため)、たとえば、sumメソッドとmulメソッドが繰り返し必要であると仮定すると便利です。私たちのコード(特定のメソッド)では、クラスレベルのメソッドを作成し、必要に応じてそれらを呼び出す1つの方法ですが、これらのメソッドがこのメソッドの外部で不要になった場合はどうなりますか?この場合、ローカルの内部クラスを作成して、以下の例で、そのメソッド内でのみ必要な場合は常にsumメソッド

class Outer {
    public void calculations() { 
        class Inner {
            public int sum(int x, int y) {
                System.out.println("sum : " + (x+y));
                return x+y;
            }
            public int mul(int x, int y) {
                System.out.println("multiplication : " + (x*y));
                return x*y;
            }
        }
        Inner i= new Inner();
//some code...
        i.sum(10, 20);
//some code...etc
        i.mul(30, 40);
        i.mul(14, 12);
        i.sum(10000, 20000);
//some other code...
    }
}
public class TestClass {
    public static void main(String[] args) {
        new Outer().calculations();
    }
}
于 2018-07-17T17:48:59.537 に答える