Lombok Getter / Setter vs Java 14 Rekord


10

Ich liebe das Projekt Lombok, aber in diesen Tagen lese und probiere ich einige der neuen Funktionen von Java 14 aus.

In der neuen Funktion befindet sich das Schlüsselwort record , mit dem eine Klasse mit bereits integrierten Funktionen erstellt werden kann: Konstruktor, private Endfelder, Accessoren, equals / hashCode, Getter, toString-Methoden.

Jetzt lautet meine Frage: Es ist besser, sich auf die Funktion von Lombok zu verlassen, oder sollten wir die Aufnahmefunktionalität verwenden:

Ist besser, dies zu verwenden:

record Person (String name, String surname) {}

oder das:

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

Was sind die Vor- und Nachteile beider Ansätze?


Zum einen recordfunktioniert es nicht für Dinge, die Getter und Setter im JavaBeans-Stil erwarten.
Mark Rotteveel

2
Der Kommentar von Rotteveel bedeutet, dass die Eigenschaftszugriffsmethode in einem Datensatz denselben Namen wie die Eigenschaft trägt. Also, alice.phoneNumber()anstatt der JavaBeans-Konvention des Präfixierens mit get, wie in alice.getPhoneNumber().
Basil Bourque

1
Die recordFunktion ist eine Vorschaufunktion , die noch nicht für die Produktion bereit ist .
Basil Bourque

Datensätze haben im Vergleich zu Klassen viele Einschränkungen. Ein Datensatz kann beispielsweise keinen anderen Datensatz oder keine andere Klasse erweitern. Weitere Informationen finden Sie im Abschnitt Einschränkungen in diesem JEP openjdk.java.net/jeps/359
NAIT

Antworten:


9

Lombok und die recordFunktion der Java-Sprache sind verschiedene Werkzeuge für verschiedene Dinge. Es gibt einige oberflächliche Überlappungen, aber lassen Sie sich davon nicht ablenken.

In Lombok geht es hauptsächlich um Syntaktik Bequemlichkeit. Es ist ein Makroprozessor, auf dem einige bekannte nützliche Codemuster vorinstalliert sind. Es verleiht keine Semantik; Es automatisiert nur die Muster gemäß einigen Reglern, die Sie im Code mit Anmerkungen festgelegt haben. Bei Lombok geht es ausschließlich um die Bequemlichkeit der Implementierung datenführender Klassen.

Datensätze sind ein semantisches Merkmal. Sie sind nominelle Tupel . Durch Erstellen einer semantischen Deklaration, Point die ein Tupel von ist (int x, int y), kann der Compiler aus dieser Zustandsbeschreibung seine Repräsentations- sowie Konstruktions-, Deklarations-, Gleichheits-, Hashing- und String-Repräsentationsprotokolle ableiten. Da sie semantisch sind, können Leser und Frameworks auch mit größerem Vertrauen über die API von Datensätzen argumentieren. (Dies kann auch syntaktisch sinnvoll sein. Wenn ja, ist das großartig.)


1
+1 Brian Goetz: Und das setzt voraus, dass Sie die aktuelle Lombok-Version in Ihre IDE aufnehmen können. Ich frage mich, ob Lombok einen bedeutenden Vorteil hinsichtlich des schnelleren Lesens von Code hat, den ein Klassenkommentar nicht vermitteln würde.
Kofferraum

4

Ich habe auch einige Zeit mit dieser Kombination herumgespielt und mit ein wenig Handarbeit konnte ich die folgenden Unterschiede auflisten:

Lombok

  • Datensätze sind noch keine veröffentlichte Funktion und lediglich eine Vorschaufunktion. Ein Aufenthalt bei Lombok ist also sinnvoller.
  • Sie sind noch kein so mächtiges Werkzeug, um Lombok insgesamt zu eliminieren. Beachten Sie, dass die Bibliothek viel mehr zu bieten hat als nur die @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode.
  • Selbsterfahren EqualsAndHashCodeist nicht das Gleiche, wie Sie es bei der Migration zu Datensätzen erwarten würden .

Aufzeichnungen

  • Wenn die Anforderung Ihrer Objektdarstellung ein "Datenträger" sein soll, können Sie dennoch die Vorteile von Datensätzen nutzen, ohne auf eine zusätzliche Bibliothek angewiesen zu sein, um den Boilerplate-Code zu reduzieren und dies genau auszuführen. Aus diesem Grund lautet dieser Blog abschließend wie folgt:

    Es wird Teams auch dabei helfen, viele handcodierte Implementierungen des zugrunde liegenden Musters zu eliminieren und den Bedarf an Bibliotheken wie Lombok zu verringern oder zu beseitigen.

Natürlich ist es im Alltag immer ratsam, anhand der Anforderungen eines Projekts zu entscheiden, welchen Weg man einschlagen und üben möchte.


Hinweis - Ich würde versuchen, dies mit weiteren Beispielen für Benutzer zu aktualisieren, um beide derzeit häufig zu verwenden.
Naman

3

NB: Anstelle dieses Weihnachtsbaums mit Anmerkungen können Sie ihn auch @Valuefür die Klasse verwenden. Beachten Sie, dass dies die Klasse endgültig macht und alle Felder sowohl privat als auch endgültig macht und Ihnen auch den Rest gibt. Dies entspricht in etwa dem, was Datensätze sind (auch sie sind endgültig, und alle darin enthaltenen Felder sind endgültig).

recordbefindet sich noch in der Vorschau, daher ist es für den Produktionscode offensichtlich noch nicht geeignet. Verwenden Sie Lombok.

Sobald die Vorschau der Datensätze nicht mehr angezeigt wird, ist dies komplizierter. Lombok ist FAR flexibler; Sie können problemlos einen neuen Aspekt austauschen, ohne den gesamten Code neu schreiben zu müssen (Sie können Ihrer Klasse beispielsweise einfach eine Erweiterungsklausel hinzufügen, ohne dann die Methode equals und hashCode handschreiben zu müssen; etwas, das Datensätze Ihnen nicht geben können). Lombok bietet Ihnen außerdem weitere Funktionen: Sie können beispielsweise einen Builder hinzufügen, indem Sie die @BuilderAnmerkung hinzufügen . nichts, was Aufzeichnungen tun können.

Wenn es höchst unwahrscheinlich ist, dass Sie etwas davon für die Klasse verwenden, die Sie entwerfen, würde ich Datensätze verwenden.

HAFTUNGSAUSSCHLUSS: Ich bin ein Hauptverantwortlicher für Project Lombok.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.