首页 > 解决方案 > 如何在 lombok 中使用 Singular 属性添加

问题描述

如何@Singular在龙目岛添加使用属性

Foo foo = ..;
FooActivity fa = ..;

foo.fooActivity(fa); // this fails - compilation error

@Builder    
class Foo {
    @Singular("fooActivity")
    private List<FooActivity> fooActivities;
}

标签: javalombok

解决方案


@Singular@Builder与注解一起使用。所以在这种情况下fooActivity,将元素添加到列表的方法是在FooBuilderlombok 生成的类中创建的,它不是Foo. 因此,您无法fooActivity使用该Foo对象进行访问。

怎么解决?这种方法有一个问题,我在最后提到过。)

您可以通过将注释toBuilder设置为来解决此问题。这将生成一个方法,该方法将返回一个构建器对象,您可以使用它来调用.true@BuilderFoofooActivity

@Builder(toBuilder = true)
public class Foo {
    @Singular("fooActivity")
    private List<FooActivity> acts;
}

// To invoke
foo = foo.toBuilder().fooActivity(fa).build();

上述方法的问题

toBuilder()将使用 in 的值生成一个构建器,foo并且build将生成一个NEW对象。所以你需要小心这一点,因为原始对象foo不是使用这种方法更新的对象。


第二种方法不推荐

使用实验功能@Delegate。Lombok网站对此功能的描述如下:

目前我们认为该功能不会很快退出实验状态,如果将来的 javac 或 ecj 版本难以继续维护该功能,则可能会放弃对该功能的支持。

当您的班级中有多个集合时,它也会导致问题。

@Builder
public class Foo {
    @Delegate
    @Builder.Default
    private List<FooActivity> acts = new ArrayList<>(); // make sure you do this while using @Delegate    
}

调用

foo.add(fa);

推荐阅读