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);
}
);
그것에 대해 모르겠어요하지만 컴파일러는 직렬화 또한 외부 변수를 찾을 수 있다고 생각하고 내가하려고 할 때 그들을 포함 그 람다를 직렬화하십시오. 자바가 그런 일을 할 수있는 트릭이 있습니까? 아니면 그러한 기능을 가진 언어가 있습니까?
예, 직렬화 된 람다는 특별한 마술없이 캡처 된 변수를 자동으로 포함해야합니다. –
아마도 여기에 설명 된 Eclipse 버그와 관련이 있습니다. http://stackoverflow.com/questions/23837215/java-8-lambdas-that-access-instance-fields-and-methods-cant-be-deserialized –
무엇입니까? 귀하의 OS/IDE/Java 버전? 나는 이것을 재현 할 수 없다. – alexh