Solución:
Puede hacerlo fácilmente con la configuración de anotaciones de Lombok
import lombok.Builder;
import lombok.ToString;
@Builder(builderMethodName = "hiddenBuilder")
@ToString
public class Person {
private String name;
private String surname;
public static PersonBuilder builder(String name) {
return hiddenBuilder().name(name);
}
}
Y luego úsalo así
Person p = Person.builder("Name").surname("Surname").build();
System.out.println(p);
Por supuesto @ToString
es opcional aquí.
No recomendaría este enfoque, ya que tendrá dificultades para aplicarlo de manera consistente en otros objetos. En su lugar, puede marcar los campos con @lombok.NonNull
anotación y Lombok generará comprobaciones nulas para usted en el constructor y establecedores, de modo que Builder.build()
fallará, si esos campos no están configurados.
El uso de patrones de construcción le permite tener una identificación muy clara de qué campos está configurando para qué valores. Esto ya se perdió para el campo de nombre en su ejemplo, y además se perderá para todos los demás campos obligatorios, si está creando un objeto con varios campos obligatorios. Considere el siguiente ejemplo, ¿puede saber qué campo es cuál con solo leer el código?
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()
Llevando la respuesta de Kevin Day un paso más allá:
@Builder
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE) // If immutability is desired
@ToString
public 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);
}
}
No es ideal, pero proporciona cumplimiento de tiempo de compilación y los llamadores de esta clase tendrán exactamente un método de construcción para usar.