枯萎(wither)与构建器(builder)Lombok库的比较

10

我开始使用Lombok库,但我无法弄清使用with和builder的区别。

@Builder
@Wither
public class Sample {
   private int x;
   private int y;
}

现在我有两种方式可以创建一个对象:

Sample s = new Sample().builder()
              .x(10)
              .y(15)
              .build();

或者

Sample s = new Sample()
           .withx(10)
           .withy(10);

这两者有什么区别?我应该使用哪一个?

2个回答

25

@Builder 用于创建可变对象,@Wither 用于创建不可变对象。

声明:本人是 lombok 开发者。


1
选择使用不可变对象的原因是什么?是否有特别的原因?像这样调用它们会很好:Sample s = new Sample().withX(10).withY(15); - BitfulByte

11

通常,使用 builder() 方法创建对象时,您必须最后调用 build() 方法,在调用 build() 方法之前,所有属性值都保存在内部 builder 对象中,而不是使用 new 创建的对象中。设置完所有属性并调用 build() 方法后,将创建一个新对象。详情请参见:https://projectlombok.org/features/Builder.html。我认为建造者模式更好的方法是:

Sample s = Sample.builder()
          .x(10)
          .y(15)
          .build();

因为第一个Sample对象是多余的。

对于 wither 方法,每次调用 withXXX(xxx) 时,都会返回一个新的对象,其中 XXX 设置为 xxx,并且从调用 wither 方法的对象中克隆所有其他属性(如果 xxx 与原始 xxx 不同。详见这里:https://projectlombok.org/features/experimental/Wither.html)。选择哪种方式,我认为只取决于你的个人习惯和项目的代码风格。

希望这可以帮助你。


2
那么我可以假设使用builder,只有在所有值都正确设置之后才会创建一个新对象。而使用wither,则在开始时创建对象,如果输入不正确,则需要GC清除它。 - user1692342
1
@user1692342 是的,使用构建器时,只会创建构建器对象,而 Sample 对象将在最后创建。您可以从 lombok 的内部实现中获取更多详细信息。 :) - Ke Li
我认为这不仅仅是个人口味问题。请参考下面@Roel Spilker的回答。 - dbaltor
因为第一个样本对象是冗余的。在这里,OP首先创建了一个新的对象,我认为使用构建器模式时构造函数往往会是私有的,并且在那里使用的空构造函数不会被暴露出来,我是正确的吗? - Ola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接