我尝试使用Java 8 lambdas并且有关于对象序列化的一般问题。 例如,如果executor.execute只有一个方法并且在没有序列化的情况下运行代码块,则以下输入将打印5。 但是,如果我通过SerializedLambda序列化lambda表达式并将其反序列化,则它会打印null,因为它在此新的反序列化对象中没有前一个上下文。此外,它编译没有任何投诉,因为第一个上下文解决了外部变量。 (本例中为finalVar):
final int finalVar = 5;
executor.execute(() -> {
System.out.println(finalVar);
});
我想知道是否可以告诉SerializedLambda将finalVar包含到序列化输出中,而不实现具有finalVar变量字段的接口,并在构造时将其值设置为字段。 AFAIK,这是用Java做这种事情最干净的方法:
final int finalVar = 5;
executor.execute(new Runnable() {
int myVar = finalVar;
public void run() {
System.out.println(myVar);
}
);
我甚至不确定,但我认为编译器可以找出外部变量,并在我尝试序列化该lambda时序列化并包含它们。有没有什么技巧可以让Java做这样的事情,还是有任何语言有这样的功能?
答案 0 :(得分:0)
无论变量范围如何,只要这些变量的类型为Serializable
,序列化的lambdas将包含外部变量。确保是这样的,你很高兴。