枯萎vs建设者龙目岛图书馆

use*_*342 6 java builder lombok

我已经开始使用Lombok库,我无法弄清楚使用wither和构建器之间的区别.

@Builder
@Wither
public class Sample {
   private int x;
   private int y;
}
Run Code Online (Sandbox Code Playgroud)

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

Sample s = new Sample().builder()
              .x(10)
              .y(15)
              .build();
Run Code Online (Sandbox Code Playgroud)

要么

Sample s = new Sample()
           .withx(10)
           .withy(10);
Run Code Online (Sandbox Code Playgroud)

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

Roe*_*ker 13

@Builder用于@Wither为不可变的对象创建可变对象.

披露:我是一名lombok开发者.


Ke *_* Li 8

通常,区别在于使用builder()构建对象时,必须最后调用build()方法,并且在调用build()之前,所有属性值都保存在内部构建器对象中,而不是您创建的对象中.新.设置完所有属性并调用build()后,将创建一个新对象.请在此处查看详细信息:https://projectlombok.org/features/Builder.html.我认为构建器模式的更好方法是:

Sample s = Sample.builder()
          .x(10)
          .y(15)
          .build();
Run Code Online (Sandbox Code Playgroud)

因为第一个Sample对象是冗余的.

对于马眼罩,每次调用withXXX(xxx)时,都会返回一个新对象,其中XXX设置为xxx,并且从您调用的对象克隆的所有其他属性都会消失(如果xxx与原始xxx不同.请参阅此处的详细信息:https://projectlombok.org/features/experimental/Wither.html).选择哪种方式,我认为这取决于您的个人习惯和项目的代码风格.

希望这可以帮到你.

  • 因此,我可以假设使用构建器,在所有值都正确设置之前不会创建新对象。而wither则在开始时创建对象,如果输入不正确,则需要GC将其清除。 (2认同)