如何将变量传递给使用lambda作为匿名函数创建的Thread的Runnable?

时间:2017-10-24 20:21:38

标签: java multithreading oop lambda scope

IntelliJ不够智能,让我感到困惑,或者我更有可能在Java(或OOP的概念)中忽略变量范围。我有这段代码:

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() {
        // ...
    }

}

我认为它很好地说明了我想要实现的目标:我想在Thread中使用SomeClass的foo属性。所以我刚刚开始编写这样的程序,然后我意识到它不正确(或者是它?)然后我很惊讶编辑器没有抱怨foo和someOtherMethod为他们无法从Thread的Runnable内部访问。

也许只是我不完全理解OOP。这段代码是否真的正确,只是foo通过值传递给匿名函数和someOtherMethod引用?

1 个答案:

答案 0 :(得分:3)

你在做什么绝对没问题。匿名类可以访问封闭类的成员。另一方面,局部变量必须先声明为final才能在匿名类中使用。