J'adore le projet Lombok mais ces jours-ci, je lis et j'essaie certaines des nouvelles fonctionnalités de java 14.
À l'intérieur de la nouvelle fonctionnalité, il y a le mot-clé record qui permet de créer une classe avec déjà intégré les fonctionnalités suivantes: constructeur, champs finaux privés, accesseurs, equals / hashCode, getters, méthodes toString.
Maintenant, ma question est la suivante: il vaut mieux s'appuyer sur la fonctionnalité de Lombok ou devrions-nous commencer à utiliser la fonctionnalité d'enregistrement:
Est préférable d'utiliser ceci:
record Person (String name, String surname) {}
ou ça:
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
@Getter private int name;
@Getter private int surname;
}
Quels sont les avantages et les inconvénients de ces deux approches?
record
ne fonctionnera pas pour les choses qui attendent des getters et des setters de style JavaBeans.alice.phoneNumber()
plutôt que la convention JavaBeans de préfixation avecget
, comme dansalice.getPhoneNumber()
.record
fonctionnalité est une fonctionnalité d'aperçu , pas encore prête à être utilisée en production.Réponses:
Lombok, et la
record
fonctionnalité du langage Java, sont différents outils pour différentes choses. Il y a un chevauchement superficiel, mais ne laissez pas cela vous distraire.Lombok est principalement une question de commodité syntaxique ; il s'agit d'un macro-processeur préchargé avec certains modèles de code utiles connus. Il ne confère aucune sémantique; il automatise simplement les motifs, selon certains boutons que vous définissez dans le code avec des annotations. Lombok est purement sur la commodité d'implémenter des classes porteuses de données.
Les enregistrements sont une caractéristique sémantique ; ce sont des tuples nominaux . En faisant une déclaration sémantique qui
Point
est un tuple de(int x, int y)
, le compilateur peut dériver sa représentation, ainsi que les protocoles de construction, de déclaration, d'égalité, de hachage et de représentation de chaîne, à partir de cette description d'état. Parce qu'ils portent la sémantique, les lecteurs et les frameworks peuvent également raisonner avec une plus grande confiance sur l'API des enregistrements. (Cela peut aussi être syntaxiquement pratique; si c'est le cas, c'est parfait.)la source
Je joue avec cette combinaison depuis un certain temps également et avec le peu de pratique, je pourrais énumérer les différences suivantes:
Lombok
@Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode
.EqualsAndHashCode
n'est pas le même que celui auquel vous vous attendez lorsqu'il s'agit de migrer vers des enregistrements .Records
Bien sûr, au jour le jour, il est toujours sage, en fonction des exigences d'un projet, de choisir la voie à suivre et à pratiquer.
la source
NB: Au lieu de cet arbre de Noël d'annotations, vous pouvez simplement utiliser
@Value
sur la classe. Notez que cela rend la classe finale, rend tous les champs à la fois privés et finaux, et vous donne également tout le reste. Ceci est proche de ce que sont les enregistrements (eux aussi sont définitifs et tous les champs à l'intérieur sont définitifs).record
est toujours en avant-première, donc pour le code de production, ce n'est évidemment pas encore approprié. Utilisez lombok.Une fois les enregistrements hors aperçu, c'est plus compliqué. Lombok est FAR plus flexible; vous pouvez facilement échanger un nouvel aspect sans avoir à réécrire tout le code (vous pouvez simplement, par exemple, ajouter une clause `` extend '' à votre classe sans avoir à écrire à la main la méthode equals et hashCode; quelque chose que les enregistrements ne peuvent pas vous donner). Lombok vous offre également plus de fonctionnalités: vous pouvez par exemple ajouter un générateur en ajoutant l'
@Builder
annotation; pas quelque chose que les enregistrements peuvent faire.S'il est hautement improbable que vous utilisiez tout cela pour la classe que vous concevez - j'utiliserais des enregistrements.
AVERTISSEMENT: Je suis un contributeur principal au projet Lombok.
la source