Lombok getter / setter vs Java 14 record


10

Adoro il progetto Lombok ma in questi giorni sto leggendo e provando alcune delle nuove funzionalità di java 14.

All'interno della nuova funzionalità, è presente la parola chiave record che consente di creare una classe con le seguenti funzionalità già integrate: costruttore, campi finali privati, accessori, equals / hashCode, getter, metodi toString.

Ora la mia domanda è: è meglio fare affidamento sulla funzionalità di Lombok o dovremmo iniziare a utilizzare la funzionalità di registrazione:

È meglio usare questo:

record Person (String name, String surname) {}

o quello:

@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
  @Getter private int name;
  @Getter private int surname;
}

Quali sono i pro e i contro di entrambi gli approcci?


Per prima cosa, recordnon funzionerà per cose che si aspettano getter e setter in stile JavaBeans.
Mark Rotteveel,

2
Ciò che il commento di Rotteveel significa è che il metodo di accesso alla proprietà su un record è chiamato lo stesso nome della proprietà. Quindi, alice.phoneNumber()piuttosto che la convenzione JavaBeans di prefisso con get, come in alice.getPhoneNumber().
Basil Bourque,

1
La recordfunzione è una funzione di anteprima , non ancora pronta per l'uso in produzione.
Basil Bourque,

I record hanno molte restrizioni rispetto alle classi, un record non può estendere un altro record o classe per esempio, controlla la sezione delle restrizioni su questo JEP openjdk.java.net/jeps/359 per ulteriori dettagli
NAIT

Risposte:


9

Lombok e la recordfunzionalità del linguaggio Java sono strumenti diversi per cose diverse. C'è qualche sovrapposizione superficiale, ma non lasciare che ti distragga.

Lombok riguarda in gran parte la convenienza sintattica ; è un microprocessore precaricato con alcuni utili schemi di codice noti. Non conferisce alcuna semantica; automatizza semplicemente i motivi, secondo alcune manopole impostate nel codice con annotazioni. Lombok si basa esclusivamente sulla praticità dell'implementazione di classi che trasportano dati.

I record sono una caratteristica semantica ; sono tuple nominali . Facendo una dichiarazione semantica che Point è una tupla (int x, int y), il compilatore può derivare la sua rappresentazione, così come i protocolli di costruzione, dichiarazione, uguaglianza, hash e rappresentazione delle stringhe, da questa descrizione di stato. Poiché portano semantica, i lettori e i framework possono anche ragionare con maggiore sicurezza sull'API dei record. (Questo può anche essere sintatticamente conveniente; in tal caso, è fantastico.)


1
+1 Brian Goetz: E questo presuppone che tu possa ottenere l'attuale versione di Lombok nel tuo IDE. Mi chiedo se Lombok abbia qualche vantaggio significativo per quanto riguarda la lettura più rapida del codice che un commento di classe non conferirebbe.
Tronco

4

Ho giocato con questa combinazione anche per un po 'di tempo e con un leggero tocco pratico ho potuto elencare le seguenti differenze:

Lombok

  • I record non sono ancora una funzionalità rilasciata e sono solo una funzionalità di anteprima. Quindi stare con Lombok ha più senso.
  • Non sono ancora uno strumento così potente per eliminare tutti insieme Lombok. Nota che la libreria ha molto di più da offrire oltre al solo @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode.
  • Sperimentato da solo, EqualsAndHashCodenon è la stessa cosa che ti aspetteresti quando si tratta di migrare ai record .

Records

  • In una nota diversa, se il requisito della rappresentazione dell'oggetto deve essere un "supporto dati", è comunque possibile cercare il vantaggio di Records, senza fare affidamento su una libreria aggiuntiva per ridurre il codice del boilerplate per eseguire ciò con precisione. Questo è il motivo per cui come nota conclusiva questo blog legge quanto segue:

    Aiuterà anche i team a eliminare molte implementazioni codificate a mano del modello sottostante e a ridurre o eliminare la necessità di librerie come Lombok.

Ovviamente, su base giornaliera, è sempre saggio in base ai requisiti di un progetto scegliere quale modo seguire e praticare.


Nota - Vorrei provare a mantenerlo aggiornato con più esempi per essere un utente per usarli entrambi frequentemente al momento.
Naman,

3

NB: Invece di quell'albero di Natale delle annotazioni, puoi semplicemente usare @Valuela lezione. Nota che questo rende la classe finale e rende tutti i campi sia privati ​​che finali e ti dà tutto il resto. Questo è vicino a ciò che sono i record (anche loro sono definitivi e tutti i campi all'interno sono definitivi).

recordè ancora in anteprima, quindi per il codice di produzione, ovviamente non è ancora adatto. Usa lombok.

Una volta che i record non sono in anteprima, è più complicato. Lombok è FAR più flessibile; puoi facilmente scambiare un nuovo aspetto senza dover riscrivere tutto il codice (puoi, ad esempio, aggiungere una clausola 'extends' alla tua classe senza dover quindi scrivere a mano il metodo equals e hashCode; qualcosa che i record non possono darti). Lombok offre anche più funzionalità: ad esempio puoi aggiungere un builder aggiungendo l' @Builderannotazione; non qualcosa che i record possono fare.

Se è altamente improbabile che userai qualcosa del genere per la classe che stai progettando, userei i record.

DISCLAIMER: sono un collaboratore principale di Project Lombok.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.