我试图使用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是否有任何技巧来做这样的事情,或者是否有任何语言具有这样的特性?
发布于 2015-03-08 19:55:31
不管变量范围如何,只要这些变量的类型是Serializable,序列化的lambda就会包含外部变量。一定要做到这一点,你就可以走了。
https://stackoverflow.com/questions/27221035
复制相似问题