395 votes

Omettre un Setter/Getter à Lombok

Je souhaite utiliser une classe de données dans Lombok. Comme elle comporte une douzaine de champs, je l'ai annotée de la mention @Data afin de générer tous les setters et getter. Cependant, il y a un champ spécial pour lequel je ne veux pas que les accesseurs soient implémentés.

Comment Lombok peut-il omettre ce champ ?

689voto

Michael Piefel Points 2007

Vous pouvez transmettre un niveau d'accès à la @Getter et @Setter annotations. Ceci est utile pour rendre les getters ou setters protégés ou privés. Elle peut également être utilisée pour remplacer la valeur par défaut.

Avec @Data Si vous avez un accès public aux accesseurs, vous avez un accès public par défaut. Vous pouvez maintenant utiliser le niveau d'accès spécial NONE pour omettre complètement l'accesseur, comme ceci :

@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private int mySecret;

1 votes

Parfait. Si le champ privé est un POJO et qu'il est également annoté avec @Delegate(), il peut être utilisé pour extraire un ensemble de propriétés dans une classe réutilisable distincte. Cela peut être utile pour avoir le même ensemble de propriétés appliqué à plusieurs classes (une sorte de mixin pour ajouter des propriétés). Par exemple, un mixin représentant un ensemble d'attributs pouvant s'appliquer à la modélisation de divers éléments XML.

1 votes

Avez-vous un problème similaire à l'omission d'un champ dans le constructeur ?

2 votes

Vous voulez dire que l'attribut ne doit pas apparaître dans le constructeur ? Non, il n'y a rien de prévu directement à cet effet. Rappelez-vous cependant que @Builder peut être placé sur les fonctions et les constructeurs ainsi que sur les classes, et ne permet de définir que les attributs qui apparaissent dans la signature de cette fonction.

56voto

Mark Rotteveel Points 20766

Selon @Data description que vous pouvez utiliser :

Tous les getters et setters générés seront publics. Pour modifier le niveau d'accès, annotez le champ ou la classe avec un @Setter et/ou @Gete explicite. et/ou une annotation @Getter. Vous pouvez également utiliser cette annotation (en combinée avec AccessLevel.NONE) pour supprimer complètement la génération d'un getter et/ou setter.

11voto

Shakthifuture Points 21

Ici, précisez @Getter / @Setter au niveau de la classe, Au niveau de la méthode, spécifiez le code ci-dessous pour omettre/exclure de la création de setter et getter. Valeur doit être utilisé à l'intérieur de @Getter ou @Setter .

@Getter(value = AccessLevel.NONE)
@Setter(value = AccessLevel.NONE)
private String mySecret;

Exemple complet :

@Getter
@Setter
public class User{

    private Long id;
    private String firstName;
    private String lastName;
    private int age;

    @Getter(value = AccessLevel.NONE)
    @Setter(value = AccessLevel.NONE)
    private String mySecret;
}

Au lieu d'utiliser @Data utiliser une annotation spécifique en fonction de vos exigences, par exemple. Utiliser @Getter et @Setter en haut de la classe pour créer un setter et un getter.

0 votes

Que signifie "coûteux" dans ce contexte ? Juste la pollution API ou quelque chose de plus subtil ?

-3voto

arpit sharma Points 14

Si le setter et le getter sont privés, cela apparaîtra dans les contrôles PMD.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X