如何在lombok 中使用@Singular
属性添加
Foo foo = ..;
FooActivity fa = ..;
foo.fooActivity(fa); // this fails - compilation error
@Builder
class Foo {
@Singular("fooActivity")
private List<FooActivity> fooActivities;
}
你试过这样的东西吗
Foo myFoo = Foo.builder()
.fooActivity(new FooActivity())
.fooActivity(new FooActivity())
.build();
@Singular
将与@Builder
注释一起使用。因此,在这种情况下,向列表中添加元素的fooActivity
方法是在lombok生成的FooBuilder
类中创建的,并且它不是Foo
的一部分。因此,无法使用Foo
对象访问fooActivity
。
如何解决(这种方法有一个问题,我在最后提到过。(
可以通过将@Builder
注释的toBuilder
设置为true
来解决此问题。这将在Foo
中生成一个方法,该方法将返回一个生成器对象,您可以使用该对象来调用fooActivity
。
@Builder(toBuilder = true)
public class Foo {
@Singular("fooActivity")
private List<FooActivity> acts;
}
// To invoke
foo = foo.toBuilder().fooActivity(fa).build();
上述方法的问题
toBuilder()
将使用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);