Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

wither vs builder Lombok library

I have started using the Lombok library, and I am unable to figure out the difference between using a wither & a builder.

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

Now I can create an object in 2 ways:

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

OR

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

What is the difference between the two? Which one should I use?

like image 671
user1692342 Avatar asked Mar 17 '17 07:03

user1692342


People also ask

What is Builder in lombok?

Overview. Project Lombok's @Builder is a helpful mechanism for using the Builder pattern without writing boilerplate code. We can apply this annotation to a Class or a method. In this quick tutorial, we'll look at the different use cases for @Builder.

Why we use@ Builder annotation?

The @Builder annotation produces complex builder APIs for your classes. @Builder lets you automatically produce the code required to have your class be instantiable with code such as: Person. builder()

What is lombok java?

What is Lombok. Project Lombok (from now on, Lombok) is an annotation-based Java library that allows you to reduce boilerplate code. Lombok offers various annotations aimed at replacing Java code that is well known for being boilerplate, repetitive, or tedious to write.


2 Answers

@Builder is used to create mutable objects, @Wither for immutables.

Disclosure: I am a lombok developer.

like image 89
Roel Spilker Avatar answered Oct 22 '22 06:10

Roel Spilker


Generally, the difference is when you build a object with builder(), you must call build() method at last, and before you call build(), all property values are saved in the internal builder object instead of the object your created with new. After you setted all properties and call build(), a new object will be created. See details here: https://projectlombok.org/features/Builder.html . I think the better way for builder pattern is:

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

Because the first Sample object is redundant.

For withers, every time you called withXXX(xxx), a new object is returned, with XXX set to xxx, and all other properties cloned from the object you called wither on (if xxx is different from the original xxx. See details here: https://projectlombok.org/features/experimental/Wither.html). Choose which way, I think it's only depends on your personal habit and your project's code style.

Hope this could help you.

like image 36
Ke Li Avatar answered Oct 22 '22 07:10

Ke Li