如何在lombok中使用奇异属性添加



如何在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);

最新更新