constructor explícito usando Lombok?
Pregunta
Estoy volver a escribir algo de código desordenado que gestiona una base de datos, y vio que el programador original creado una clase asignada a la base de datos de este modo:
(He quitado el código innecesario que no tiene ningún propósito en esta pregunta)
@Entity
@Data
@EqualsAndHashCode(callSuper = false, of = { "accessionCode", "header", "date" })
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
@Id
@NaturalId
@NotEmpty
@Length(max = 4)
private String accessionCode;
@NaturalId
@NotEmpty
private Date date;
@NaturalId
// We allow for the header to be 'null'
private String header;
private Boolean isValidDssp;
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated = new Date(System.currentTimeMillis());
protected PDBEntry(){}
public PDBEntry(String accessionCode, String header, Date date){
this.accessionCode = accessionCode;
this.header = header;
this.date = date;
}
}
Todavía soy un principiante en el uso de Hibernate y Lombok, pero ¿no sería esto hacer lo mismo y me Lombok no crear automáticamente el constructor sea necesario para usted?
@Entity
@Data
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
@Id
@NaturalId
@NotEmpty
@NonNull
@Length(max = 4)
private String accessionCode;
@NaturalId
@NotEmpty
@NonNull
private Date date;
@NaturalId
// We allow for the header to be 'null'
private String header;
private Boolean isValidDssp;
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated = new Date(System.currentTimeMillis());
}
Además, el programador original de este código dice que permite la cabecera para ser 'nulo', sin embargo, crea explícitamente un constructor que necesita un valor de cabecera. Me estoy perdiendo algo o esto es un poco contradictorio?
Solución
Para consultar @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
.
El comportamiento del constructor @Data
es como @RequiredArgsConstructor
:
@RequiredArgsConstructor genera una constructor con 1 parámetro para cada campo que requiere un manejo especial. Todos los campos finales reciben un parámetro, como se así como los campos que están marcados como @NonNull que no se inicializan cuando se declaran.
Dado que ninguno de sus campos son bien final
o @NonNull
, esto dará lugar a un constructor sin argumentos. Sin embargo, esto no es la forma más expresiva para lograr este comportamiento.
Lo que probablemente querrá en este caso es un @NoArgsConstructor
(opcionalmente en combinación con un @AllArgsConstructor
), para comunicar con claridad el comportamiento previsto, como también se indica en la documentación:
Ciertas construcciones de Java, como hibernación y el Proveedor de Servicio Interfaz de requerir un no-args constructor. Esta anotación es útil principalmente en combinación con cualquiera @Data o uno de los otros constructor anotaciones de generación.
Otros consejos
Esa parte es contradictorio que tienes razón. No he utilizado antes de Lombok pero con hibernación si desea ser capaz de crear un frijol y persistir necesita el constructor por defecto como se indica más arriba en lo que era consciente. Utiliza Constructor.newInstance () para crear instancias de objetos nuevos.
Aquí hay alguna documentación de hibernación, que entra en más detalles.
Si está utilizando @Data con un campo @NonNull y todavía quiere una noargs-constructor, es posible que quieras tratar de añadir los 3 juntos anotación
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
Al parecer un viejo IntelliJ error que hice duplicado en Eclipse Kepler y Lombok v0.11.4
@NoArgsConstructor,
@RequiredArgsConstructor,
@AllArgsConstructor
Generar constructores que toman ningún argumento, un argumento por campo final / no nulo, o un argumento para cada campo. Lea este Lombok-proyecto
@Data
@RequiredArgsConstructor /*Duplicate method Someclass() in type Someclass*/
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true) /*Duplicate method Someclass() in type Someclass*/
@Entity
public class Someclass {
@Id
private String id;
private String name;
private Type type;
public static enum Type { X , Y, Z}
}
Fijo que al hacer variables miembro final
@Data
@RequiredArgsConstructor
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
@Entity
public class Someclass {
@Id
private final String id;
private final String name;
private final Type type;
public static enum Type { X , Y, Z}
}