Javaまたはこの機能を利用する他の言語のローカルクラスの利点は何ですか?
3 に答える
匿名内部クラス、ローカル内部クラス、および通常の内部クラスがプログラムにどのように存在するかの例を次に示します。この例では、クラスに存在するmyMethod
メソッドとクラスを見ています。議論のために、これらのクラスはすべてインターフェースを実装します。InnerClass
MyClass
Runnable
public class MyClass
{
public void myMethod()
{
// Anonymous inner class
Runnable r = new Runnable() {
public void run() {}
};
// Local inner class
class LocalClass implements Runnable
{
public void run() {}
}
}
// ... //
// Inner class
class InnerClass implements Runnable
{
public void run() {}
}
}
匿名の内部クラスを使用すると、Runnable
実際にクラスを書き出して名前を付ける必要なく、実装するクラスを簡単に作成できます。krosenvoldが彼の投稿で言及したように、これは Java の「貧しい人々 の閉鎖」として使用されます。
Thread
たとえば、匿名内部クラスの使用を開始する非常に簡単な方法は次のようになります。
new Thread(new Runnable() {
public void run()
{
// do stuff
}
}).start();
ローカル インナー クラスを使用して、ローカル スコープ内にあるクラスを作成できます。このクラスは、 の外部にある他のメソッドからはアクセスできませんmyMethod
。
LocalClass
別のメソッドがあり、そのメソッド内にあるのインスタンスを作成しようとした場合、それはmyMethod
できません。
public void anotherMethod()
{
// LocalClass is out of scope, so it won't be found,
// therefore can't instantiate.
new Thread(new LocalClass()).start();
}
内部クラスは、内部クラスが配置されているクラスの一部です。したがって、たとえば、内部クラスInnerClass
は、MyClass.InnerClass
. もちろん、別のメソッドがMyClass
内部クラスをインスタンス化できることも意味します。
public void anotherMethod()
{
// InnerClass is part of this MyClass. Perfectly instantiable.
new Thread(new InnerClass()).start();
}
final
匿名内部クラスとローカル内部クラスに関するもう 1 つの点は、次のように宣言されている変数にアクセスできることmyMethod
です。
public void myMethod()
{
// Variable to access from anonymous and local inner classes.
final int myNumber = 42;
// Anonymous inner class
Runnable r = new Runnable() {
public void run()
{
System.out.println(myNumber); // Works
}
};
// Local inner class
class LocalClass implements Runnable
{
public void run()
{
System.out.println(myNumber); // Works
}
}
// ... //
それで、利点は何ですか?独立した本格的な内部クラスまたはクラスを使用する代わりに、匿名の内部クラスとローカルの内部クラスを使用すると、前者はfinal
、それらが宣言されているメソッド内の変数にアクセスできるようになります。同時に、クラスはそのクラスに対してローカルです。メソッド自体であるため、外部のクラスや同じクラス内の他のメソッドからアクセスすることはできません。
匿名の内部クラスでは得られない、ローカル クラスでできることはたくさんあります。
- タイプには名前があるため、スーパータイプにないメンバーをより便利に追加できます
- 特定の名前を付けると、スタック トレースを追跡しやすくなります (特にロック オブジェクトの場合)。
- 複数の基本タイプのサブタイプ
- 複数の場所での構築、および複数のコンストラクタ
一方で、それらは非常に冗長な構文をさらに厄介なものにします。
親クラスからロジックを取り出してオブジェクト化することができます。これにより、機能が属していない場所から機能が削除され、独自のクラスに配置されます。しかし、この新しいオブジェクトが短時間だけ必要であり、コードの単一ブロックの期間だけ必要な場合はどうなるでしょうか。さて、それはローカルクラスが適合するところです。