La valeur par défaut à lombok. Comment init par défaut avec à la fois constructeur et entrepreneur
J'ai un objet
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
private int id;
private String nick;
private boolean isEmailConfirmed = true;
}
Et je l'initialiser dans deux façons
UserInfo ui = new UserInfo();
UserInfo ui2 = UserInfo.builder().build();
System.out.println("ui: " + ui.isEmailConfirmed());
System.out.println("ui2: " + ui2.isEmailConfirmed());
Ici, elle est sortie
ui: true
ui2: false
Il semble que le constructeur n'a pas de valeur par défaut. - Je ajouter @Builder.Default
annotation pour mon bien et mon objet ressemble maintenant à ceci
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
private int id;
private String nick;
@Builder.Default
private boolean isEmailConfirmed = true;
}
Ici est sortie de la console
ui: false
ui2: true
Comment puis-je faire à la fois être true
?
On dirait qu'il est un problème connu (voir github.com/rzwitserloot/lombok/issues/1347).
OriginalL'auteur Vitalii | 2017-12-19
Vous devez vous connecter pour publier un commentaire.
Ma conjecture est qu'il n'est pas possible (sans avoir delomboked le code). Mais pourquoi ne pas simplement mettre en œuvre le constructeur dont vous avez besoin? Lombok est là pour rendre votre vie plus facile, et si quelque chose ne fonctionne pas avec les Lombok, il suffit de faire à l'ancienne.
Sortie de la Console:
@Builder.Default
est interrompue à partir de v1.16.16 = Il va initialiser les champs denull
quelle que soit la valeur par défaut initialisées à la valeur définie au niveau du terrain... Voir iciLa solution n'est pas parfaite, comme vous l'avez deux initialiser le champ à deux reprises. Une fois sur le terrain de la déclaration, et la deuxième fois dans un constructeur. Elle rend le code source d'erreurs. J'ai l'habitude d'utiliser ce un stackoverflow.com/a/50392165/2443502
Pour rendre le code moins sujettes à l'erreur, j'ai ajouté un test Unitaire qui permettent de vérifier que le pas-arg constructeur est bien écrit :
assertThat(new UserInfo().equals(UserInfo.builder().build()).describedAs("some properties marked with @Builder.Default are not properly set in the no-arg constructor").isTrue();
OriginalL'auteur Michael A. Schaffrath
Depuis le
@Builder.Default
annotation est cassé, je ne voudrais pas l'utiliser du tout. Vous pouvez, cependant, utiliser l'approche suivante:De cette façon, vous vous assurez:
isEmailConfirmed
est initialisé dans un seul endroit du code, moins de risques d'erreurs et plus facile à maintenir plus tardUserInfo
classe seront initialisés de la même façon, soit vous utilisez un constructeur ou d'un non-args constructeurEn d'autres termes, la condition est
true
:Dans ce cas, la création de l'objet est conforme, peu importe comment vous le créez. Il est particulièrement important lorsque votre classe est utilisée par un framework de mapping ou par JPA fournisseur lorsque vous n'êtes pas instancier manuellement par un constructeur, mais aucun des arguments du constructeur est appelé derrière votre dos pour créer l'instance.
L'approche décrit ci-dessus est très similaire, mais il a un inconvénient majeur. Vous devez initialiser le champ en deux endroits, ce qui rend le code du risque d'erreur que vous êtes tenu de conserver les valeurs cohérentes.
Tous les autres outils ont un seul gros inconvénient: Ils génèrent une nouvelle classe. Ils ont sûrement moins de problèmes comme ils sont juste annotation processeurs utilisant un bien connu (et moche) de l'API. Lombok a à travailler différemment et il a, en effet, quelques bugs. Cependant, je l'utilise depuis le début et je suis très heureux avec elle.
L'annotation n'est pas totalement rompu, mais il a des problèmes avec les objets primitifs. Les valeurs par défaut sont de travail pour moi avec
Boolean
de la version1.16.22
Pour tous ceux qui veulent savoir comment le faire, quand vous avez
@Singular
annotations, découvrez ce commentaire: github.com/rzwitserloot/lombok/issues/... TLDR: Déplacez votre@Singular
annotations dans le nouvellement créé constructeur privé.OriginalL'auteur Marcin Kłopotek
Une autre façon est de définir votre propre getter méthode primordial la lombok de lecture:
Votre point est bonne, mais je pense que peut être manipulée en utilisant Obsolète annotation sur ce domaine privé de le restreindre à l'aide directement. Aussi, si je suis le réalisateur de cette classe, et je sais que j'ai besoin d'une valeur par défaut et j'ai écrit un code pour cela, alors évidemment, je devrait être en sachant que je ne devrais pas utiliser ce champ directement pour l'utiliser sur une autre logique de la méthode dans cette classe.
OriginalL'auteur Sahil Chhabra