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?
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.
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. 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.
@Builder
is used to create mutable objects, @Wither
for immutables.
Disclosure: I am a lombok developer.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With