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?
record
funktioniert es nicht für Dinge, die Getter und Setter im JavaBeans-Stil erwarten.alice.phoneNumber()
anstatt der JavaBeans-Konvention des Präfixierens mitget
, wie inalice.getPhoneNumber()
.record
Funktion ist eine Vorschaufunktion , die noch nicht für die Produktion bereit ist .Antworten:
Lombok und die
record
Funktion 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.)quelle
Ich habe auch einige Zeit mit dieser Kombination herumgespielt und mit ein wenig Handarbeit konnte ich die folgenden Unterschiede auflisten:
Lombok
@Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode
.EqualsAndHashCode
ist nicht das Gleiche, wie Sie es bei der Migration zu Datensätzen erwarten würden .Aufzeichnungen
Natürlich ist es im Alltag immer ratsam, anhand der Anforderungen eines Projekts zu entscheiden, welchen Weg man einschlagen und üben möchte.
quelle
NB: Anstelle dieses Weihnachtsbaums mit Anmerkungen können Sie ihn auch
@Value
fü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).record
befindet 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
@Builder
Anmerkung 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.
quelle