I would suggest an overloaded static method builder
taking the required arguments and returning the builder object. Thus lombok won't be generating a builder
method since we have already defined it.
@Builder
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Person {
// fields....
public static PersonBuilder builder(String name) {
return new PersonBuilder().name(name);
}
}
The private
access level could enforce that the object be created using only the of
method.
For the requirement of "builder setters for the optional stuff", such that you cannot invoke name()
on the builder object, you may try to override the builder methods for the required arguments to make it private
. Refer here. (Also related use case)
@Builder
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Person {
// fields....
public static PersonBuilder builder(String name) {
return new PersonBuilder().name(name);
}
public static class PersonBuilder {
private PersonBuilder name(String name) {
this.name = name;
return this;
}
}
}
// invoke as
Person.builder("my name").age(23).build();