2014-12-01 2 views
6

Java 8 람다를 사용하고 개체 직렬화에 대한 일반적인 질문이 있습니다. 예를 들어, 다음 입력은 executor.execute에 하나의 메소드 만 있고 코드 블록을 직렬화하지 않고 실행하는 경우 5를 인쇄합니다. 그러나 SerializedLambda를 통해 람다 식을 직렬화하고 역 직렬화하는 경우이 새 deserialized 개체에 이전 컨텍스트가 없으므로 null을 인쇄합니다. 또한 첫 번째 컨텍스트가 외부 변수를 해결하므로 불만없이 컴파일됩니다. (이 예에서 finalVar)개체 직렬화시 외부 변수 포함

final int finalVar = 5; 
executor.execute(() -> { 
    System.out.println(finalVar); 
}); 

I 그것이 finalVar 변수 필드를 갖는 인터페이스를 구현하지 않고 순차 출력으로 finalVar 포함하도록 SerializedLambda 말과 필드 경우에 값을 설정하는 것이 가능인지 궁금 건설. AFAIK,이 자바와 같은 일을 할 수있는 가장 깨끗한 방법입니다

final int finalVar = 5; 
executor.execute(new Runnable() { 
    int myVar = finalVar; 

    public void run() { 
     System.out.println(myVar); 
    } 
); 

그것에 대해 모르겠어요하지만 컴파일러는 직렬화 또한 외부 변수를 찾을 수 있다고 생각하고 내가하려고 할 때 그들을 포함 그 람다를 직렬화하십시오. 자바가 그런 일을 할 수있는 트릭이 있습니까? 아니면 그러한 기능을 가진 언어가 있습니까?

+0

예, 직렬화 된 람다는 특별한 마술없이 캡처 된 변수를 자동으로 포함해야합니다. –

+0

아마도 여기에 설명 된 Eclipse 버그와 관련이 있습니다. http://stackoverflow.com/questions/23837215/java-8-lambdas-that-access-instance-fields-and-methods-cant-be-deserialized –

+0

무엇입니까? 귀하의 OS/IDE/Java 버전? 나는 이것을 재현 할 수 없다. – alexh

답변

0

변수 범위에 관계없이 직렬화 된 람다는 변수의 유형이 Serializable 인 경우 외부 변수를 포함합니다. 그것이 사실인지 확인하고 갈 수 있습니다.