1

我通过让我的表单实现来实现历史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);
    }
}

有机会解决这个问题吗?

4

0 回答 0