Required arguments with a Lombok @Builder Required arguments with a Lombok @Builder java java

Required arguments with a Lombok @Builder


You can do it easily with Lombok annotation configuration

import lombok.Builder;import lombok.ToString;@Builder(builderMethodName = "hiddenBuilder")@ToStringpublic class Person {    private String name;    private String surname;    public static PersonBuilder builder(String name) {        return hiddenBuilder().name(name);    }}

And then use it like that

Person p = Person.builder("Name").surname("Surname").build();System.out.println(p);

Of course @ToString is optional here.


I would recommend against this approach, as you will struggle to apply it consistently on other objects. Instead, you can just mark fields with @lombok.NonNull annotation and Lombok will generate null checks for you in the constructor and setters, so that Builder.build() will fail, if those fields are not set.

Using builder pattern allows you to have very clear identification of which fields you're setting to which values. This is already lost for name field in your example, and it will further be lost for all other required fields, if you're building an object with multiple required fields. Consider the following example, can you tell which field is which just by reading code?

Person.builder("John", "Michael", 16, 1987) // which is name, which is surname? what is 16?    .year(1982) // if this is year of birth, then what is 1987 above?    .build()


Taking Kevin Day's answer a step further:

@Builder@Getter@AllArgsConstructor(access = AccessLevel.PRIVATE) // If immutability is desired@ToStringpublic class Person {    @NonNull // Presumably name cannot be null since its required by the builder    private final String name;    private final String surname;    private static PersonBuilder builder() {        return new PersonBuilder();    }    public static PersonBuilder builder(String name){        return builder().name(name);    }}

It's not ideal, but it provides compile time enforcement and callers of this class will have exactly one builder method to use.