inner example data java spring-boot lombok

java - example - Valor por defecto en lombok. Cómo iniciar por defecto con el constructor y el constructor



lombok java (3)

Mi conjetura es que no es posible (sin haber desactivado el código). Pero, ¿por qué no implementas el constructor que necesitas? Lombok está destinado a hacer su vida más fácil, y si algo no funciona con Lombok, simplemente hágalo a la antigua.

@Data @Builder @AllArgsConstructor public class UserInfo { private int id; private String nick; @Builder.Default private boolean isEmailConfirmed = true; public UserInfo(){ isEmailConfirmed = true; } }

Salida de consola:

ui: true ui2: true

Tengo un objeto

@Data @Builder @NoArgsConstructor @AllArgsConstructor public class UserInfo { private int id; private String nick; private boolean isEmailConfirmed = true; }

Y lo inicializo de dos maneras.

UserInfo ui = new UserInfo(); UserInfo ui2 = UserInfo.builder().build(); System.out.println("ui: " + ui.isEmailConfirmed()); System.out.println("ui2: " + ui2.isEmailConfirmed());

Aquí está la salida

ui: true ui2: false

Parece que el constructor no obtiene un valor predeterminado. Agrego la anotación @Builder.Default a mi propiedad y mi objeto ahora se ve así.

@Data @Builder @NoArgsConstructor @AllArgsConstructor public class UserInfo { private int id; private String nick; @Builder.Default private boolean isEmailConfirmed = true; }

Aquí está la salida de la consola

ui: false ui2: true

¿Cómo puedo hacer que ambos sean true ?


Otra forma es definir su propio método getter anulando a lombok getter:

@Data @Builder @AllArgsConstructor public class UserInfo { private int id; private String nick; private Boolean isEmailConfirmed; public Boolean getIsEmailConfirmed(){ return Objects.isNull(isEmailConfirmed) ? true : isEmailConfirmed; } }


Ya que la github.com/rzwitserloot/lombok/issues/1347 , no la usaría en absoluto. Puede, sin embargo, utilizar el siguiente enfoque:

@Data @NoArgsConstructor public class UserInfo { private int id; private String nick; private boolean isEmailConfirmed = true; @Builder @SuppressWarnings("unused") private UserInfo(int id, String nick, Boolean isEmailConfirmed) { this.id = id; this.nick = nick; this.isEmailConfirmed = Optional.ofNullable(isEmailConfirmed).orElse(this.isEmailConfirmed); } }

De esta manera te aseguras:

  • el campo isEmailConfirmed se inicializa solo en un lugar, lo que hace que el código sea menos propenso a errores y más fácil de mantener más tarde
  • la clase UserInfo se inicializará de la misma manera, ya sea que use un constructor o un constructor sin argumentos

En otras palabras, la condición es true :

new UserInfo().equals(UserInfo.builder().build())

En ese caso, la creación del objeto es coherente, no importa cómo lo cree. Es especialmente importante cuando su estructura es utilizada por un marco de mapeo o por un proveedor de JPA cuando no está creando instancias manualmente por un constructor, pero se invoca un constructor sin argumentos detrás de su espalda para crear la instancia.

El enfoque descrito anteriormente es muy similar pero tiene un gran inconveniente. Debe inicializar el campo en dos lugares, lo que hace que el código sea propenso a errores, ya que debe mantener los valores coherentes.