2017-10-24 12 views
0

IntelliJはインテリジェントではありませんし、私を混乱させるか、Javaの変数のスコープ(またはOOPの概念)について私が見逃している可能性があります。ラムダを無名関数として作成したスレッドのRunnableに変数を渡すには?

public class SomeClass { 

    private String foo = "something"; 

    public void someMethod() { 
     new Thread(() -> { 
      String bar = foo; // How can foo be accessed from here? 
      someOtherMethod(); // Even for this IntelliJ shows no error. 
     }).start(); 
    } 

    public void someOtherMethod() { 
     // ... 
    } 

} 

私はそれは私が達成しようとしているものをかなりよく示して考える:私は、コードのこの部分を持っている私は、そのスレッド内の工assのfooプロパティで作業したいと思います。だから私はちょうどこのような私のプログラムを書くようになってから、それは正しいのではないことに気がつきましたが、エディタがスレッドの内部からアクセスできないfooとsomeOtherMethodについて不平を言っていないことにかなり驚いていました実行可能ファイル。

多分私はOOPを完全に理解していないのです。このコードは本当に正しいですか?ちょうどfooが無名関数に値渡しされ、someOtherMethodが参照渡しされていますか?

+0

コンパイルしますか?それは実行されますか?それはあなたが期待することをしていますか?答えがイエスならば、それは正しいです。だからそれを試してみてください。 Lambdasは、内部クラスのように、その囲むクラスのメンバーにアクセスできます。 –

答えて

1

あなたがやっていることは、まったく問題ありません。匿名クラスは、囲むクラスのメンバーにアクセスできます。一方、ローカル変数は、匿名クラスで使用する前にfinal宣言する必要があります。

+1

これは実際にラムダが非常に便利な理由の1つです。彼らは範囲外の変数を閉じてそれらを持ち歩くことができます(https://en.wikipedia.org/wiki/Closure_(computer_programming))彼らがどこに呼ばれてもどこにでも行きます。 Javaでは、答えが指摘するように、これはやや制限されていますが、それでもなお非常に強力です。 – Spaceman1701

関連する問題