11

他のスレッドに値を渡す必要がある多くの状況に遭遇し、この方法でそれを実行できることがわかりましたが、それがどのように機能するのか疑問に思っていました。

public void method() {
    final EventHandler handle = someReference;

    Thread thread = new Thread() {
        public void run() {
            handle.onEvent();
        }
    };

    thread.start();
}

編集:私の質問が私が知りたいことを正確に指しているわけではないことを理解してください。それは「なぜ」というよりも「どのように」機能するかということです。

4

4 に答える 4

9

これがどのように機能するかについてのより長い説明です:http://techtracer.com/2008/04/14/mystery-of-accessibility-in-local-inner-classes/

于 2010-06-26T20:32:47.600 に答える
8

他のメソッドのローカル変数にアクセスできるメソッドはありません。これには、例のような匿名クラスのメソッドが含まれます。つまりrun、匿名Threadクラスのメソッドは、のローカル変数にアクセスできませんmethod()

ローカル変数の前に書き込むfinalことは、プログラマーとして、変数が実際に値として扱われる可能性があることをコンパイラーに知らせる方法です。この変数(値の読み取り!)は変更されないため、他の方法でアクセスしても問題ありません。

于 2010-06-26T20:30:40.747 に答える
7

内部クラスを逆コンパイルするだけで、その下で何が起こっているかを知ることができます。簡単な例を次に示します。

このコードをコンパイルした後:

public class Test {

 public void method() {
     final Object handle = new Object();

     Thread thread = new Thread() {
         public void run() {
             handle.toString();
         }
     };

     thread.start();
 }
}

の内部クラスのためTest.classTest.java取得します。逆コンパイルすると、次のように表示されます。Test$1.classTest.javaTest$1.class

class Test$1 extends Thread
{
  final Test this$0;
  private final Object val$handle;

  public void run()
  {
    this.val$handle.toString();
  }
}

ご覧のとおり、handle変数の代わりに。がありthis.val$handleます。これは、フィールドとして内部クラスにhandleコピーされることを意味します。val$handleそして、これは、が変更されない場合にのみ正しく機能します。handleつまり、Javaでは変更する必要がありますfinal

this$0また、内部クラスには外部クラスへの参照であるフィールドがあることに気付くでしょう。これは、非静的内部クラスが外部クラスとどのように通信できるかを示しています。

于 2010-06-26T20:51:11.547 に答える
2

この内部クラスは、次のようなコードに変換されます。

class InnerClass extends Thread {
    private EventHandler handle;

    public InnerClass(EventHandler handle) {
        this.handle = handle;
    }

    public void run() {
        handle.onEvent();
    }
}

...

EventHandler handle = someReference;
Thread thread = new InnerClass(handle);
thread.start();

内部クラスには実際に最終変数のコピーが渡されるため、外部クラスに表示されるような変更を加えることはできません。このパラメーターに変更を加えようとしても許可しないようにするには、内部クラスの最終変数にのみアクセスできます。

于 2010-06-26T20:43:18.877 に答える