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

} 

나는 그것이 내가 달성하기 위해 노력하고있어 꽤 잘 설명 생각 : 나는이 코드 조각이 난 그 스레드 내부 SomeClass의 foo는 속성 작업을하고 싶습니다. 그래서 저는 방금이 프로그램을 작성하기 시작했습니다. 그리고 나서 그것이 올바르지 않다고 생각 했었습니다. 그렇지만 편집기가 foo와 someOtherModod에 대해 불평하지 않는다는 것에 상당히 놀랐습니다. 스레드의 내부에서 접근 할 수 없기 때문입니다. 실행 가능.

어쩌면 전적으로 OOP를 완전히 이해하지 못했습니다. 이 코드는 정말로 정확하며 단지 foo가 익명의 함수에 값으로 전달되고 참조로 someOtherMethod에 전달되는 것입니까?

+0

컴파일됩니까? 실행됩니까? 그것은 그것이 당신이 기대하는 것을합니까? 대답이 '예'라면 올바른 것입니다. 그럼 그냥 테스트 해봐. 내부 클래스와 마찬가지로 Lambdas는 클래스를 묶는 멤버에게 액세스 할 수 있습니다. –

답변

1

당신이하고있는 일은 절대적으로 좋습니다. 익명 클래스는 포함하는 클래스의 멤버에 액세스 할 수 있습니다. 반면에 지역 변수는 익명 클래스에서 사용되기 전에 최종 선언되어야합니다.

+1

그리고 이것은 실제로 람다 (lambda)가 매우 유용한 이유 중 하나입니다. 범위를 벗어난 변수를 ([https://en.wikipedia.org/wiki/Closure_ (computer_programming)] '변수를 통해 닫을 수 있습니다. 어디서나 전화를 걸 수 있습니다. 자바에서는 대답이 지적했듯이 다소 제한적이지만 여전히 강력 할 수 있습니다. – Spaceman1701