我通过让我的表单实现来实现历史reconstructor
,这是一种返回 lambda 的方法。它可以很简单
@Override protected Supplier<MpxForm> reconstructor() {
return () -> new MyForm1();
}
或更复杂的,例如,
@Override protected Supplier<MpxForm> reconstructor() {
State currentState = this.currentState;
Set<Item> selectedItems = this.selectedItems;
return () -> new MyForm2(currentState, selectedItems);
}
没有一个 lambdas 需要访问封闭的实例。这很重要,因为它允许对表单进行垃圾收集。
然而,使用retrolambdas,它们被转换为一个内部类,正如我被告知的那样,它们用作this
对其周围类的引用,因此它们像非静态内部类一样引用其父级。
这是不必要的,IIUIC,retrolambda可以做到这一点:
Lambda 表达式通过将它们转换为匿名内部类来反向移植。这包括对无状态 lambda 表达式使用单例实例的优化,以避免重复的对象分配。
显然,我的第一个片段中的 lambda 是无状态的,尽管如此,它被转换为具有类型实例变量的类MyForm1
。缺少上述优化。
我的第二个片段中的 lambda 有两个实例变量,不需要对封闭类的引用,因此它可以转换为嵌套类,如
@RequiredArgsConstructor static class MyForm2$Lambda1 implements Runnable {
private final State currentState;
private final Set<Item> selectedItems;
@Override public void run() {
return new MyForm2(currentState, selectedItems);
}
}
有机会解决这个问题吗?