2010-10-05 13 views
13

Sto riscrivendo un codice disordinato che gestisce un database, e vide che il programmatore originale creato una classe mappata al database in questo modo:Costruttore esplicito che usa Lombok?

(codice non necessario ho rimosso che non ha scopo di questa domanda)

Sono ancora un principiante in Hibernate e uso Lombok, ma questo non farebbe la stessa cosa e Lombok non creerà automaticamente il costruttore necessario per te?

@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()); 
} 

Inoltre, il programmatore originale di questo codice dice che consente per l'intestazione di essere 'nulla', eppure ha creato in modo esplicito un costruttore che ha bisogno di un valore per l'intestazione. Mi manca qualcosa o è un po 'contraddittorio?

risposta

12

Dai un'occhiata alla @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor.

Il comportamento costruttore @Data è come @RequiredArgsConstructor:

@RequiredArgsConstructor genera un costruttore con 1 parametro per ogni campo che richiede una gestione speciale. Tutti i campi finali ottengono un parametro, come come tutti i campi contrassegnati come @NonNull non inizializzati dove sono dichiarati .

Dato che nessuno dei vostri campi sono o final o @NonNull, questo si tradurrà in un costruttore senza argomenti. Tuttavia, questo non è il modo più espressivo per ottenere questo comportamento.

Che probabilmente si vorrà in questo caso è una @NoArgsConstructor (eventualmente associato ad un @AllArgsConstructor), per comunicare in modo chiaro il comportamento previsto, come è anche indicato nella documentazione:

alcuni costrutti Java, come ad come hibernate e il fornitore di servizi Interfaccia richiede un costruttore no-args . Questa annotazione è utile principalmente in combinazione con @Data o con un'altra delle annotazioni di creazione del costruttore .

+0

Sì, ho letto su @RequiredArgsConstructor, ma dal momento che è standard in @Data non l'ho aggiunto. La mia domanda era se usassi correttamente le annotazioni dal momento che il programmatore originale usava Lombok ma non usava le annotazioni @NonNull, ma utilizzava costruttori espliciti. Tu dici che nessuno dei miei campi è @NonNull, ma guarda attentamente nel mio codice (la seconda casella), ho annotato i campi accessionCode e date con @NonNull. Ora poiché Hibernate sembra davvero richiedere un costruttore no-args, sarebbe un buon stile? @ Data @NoArgsConstructor (accesso = AccessLevel.PROTECTED) @RequiredArgsConstructor – FinalArt2005

+0

Sì, sarebbe la strada da percorrere .. – Tim

+3

Ok, solo per chiunque abbia iniziato a usare Lombok, ho appena sentito che @RequiredArgsConstructor non è molto robusto, prende l'ordine dei campi nella tua classe per costruire il costruttore, quindi se qualcun altro cambia questo ordine il tuo codice che chiama il costruttore smette di funzionare, quindi risulta che il costruttore esplicito è ancora la scelta migliore. Il @NoArgsConstructor (access = AccessLevel.PROTECTED) tuttavia sembra essere utile se stai usando Hibernate. Grazie a tutti per il vostro aiuto. – FinalArt2005

1

Questo bit è contraddittorio, hai ragione. Non ho usato Lombok prima ma con l'ibernazione, se vuoi essere in grado di creare un bean e persistere hai bisogno del costruttore predefinito come indicato sopra, per quanto ne sapevo. Utilizza Constructor.newInstance() per creare un'istanza di nuovi oggetti.

Ecco alcuni documenti di ibernazione che vanno più nel dettaglio.

Hibernate Documentation

+0

L'annotazione @Data sopra la classe def creerà questo costruttore predefinito per quanto ne so, e da quanto ho imparato fino ad ora le annotazioni @NonNull sopra i campi faranno in modo che Lombok esegua questi parametri di campo in quello costruttore in modo che devi dare valori per loro, e controllerà anche se sono nulli. Ma dal momento che sono nuovo a questo mi chiedevo se sono solo io o che il programmatore originale ha fatto alcuni piccoli errori qui. – FinalArt2005

1

Se si utilizza @Data con un campo @NonNull e vuole ancora un noargs costruttore, si potrebbe desiderare di provare ad aggiungere tutti e 3 insieme annotazione

@NoArgsConstructor 
@RequiredArgsConstructor 
@AllArgsConstructor 

A quanto pare un vecchio intelliJ bug che ho fatto replicare in Eclipse Kepler e lombok v0.11.4

Problemi correlati