Utilisation de l'annotation @Accessors de Lombok

1. Vue d'ensemble

Il est assez courant d'avoir des méthodes get et set dans nos objets de domaine, mais il existe d'autres moyens que nous pouvons trouver plus expressifs.

Dans ce didacticiel, nous découvrirons l' annotation @Accessors de Project Lombok et sa prise en charge des accesseurs fluides, chaînés et personnalisés.

Avant de continuer, cependant, notre IDE devra installer Lombok.

2. Accesseurs standard

Avant d'examiner l' annotation @Accessors , examinons comment Lombok traite les annotations @Getter et @Setter par défaut.

Commençons par créer notre classe:

@Getter @Setter public class StandardAccount { private String name; private BigDecimal balance; }

Et maintenant, créons un cas de test. Nous pouvons voir dans notre test que Lombok a ajouté des méthodes getter et setter typiques:

@Test public void givenStandardAccount_thenUseStandardAccessors() { StandardAccount account = new StandardAccount(); account.setName("Basic Accessors"); account.setBalance(BigDecimal.TEN); assertEquals("Basic Accessors", account.getName()); assertEquals(BigDecimal.TEN, account.getBalance()); }

Nous verrons comment ce cas de test change en examinant les options de @Accessor .

3. Accesseurs courants

Commençons par l' option courante :

@Accessors(fluent = true)

L' option fluent nous donne des accesseurs qui n'ont pas de préfixe get ou set .

Nous allons jeter un oeil à l' option chain dans un instant, mais comme elle est activée par défaut, désactivons-la explicitement pour l'instant:

@Accessors(fluent = true, chain = false) @Getter @Setter public class FluentAccount { private String name; private BigDecimal balance; }

Maintenant, notre test se comporte toujours de la même manière, mais nous avons changé la façon dont nous accédons et muter l'état:

@Test public void givenFluentAccount_thenUseFluentAccessors() { FluentAccount account = new FluentAccount(); account.name("Fluent Account"); account.balance(BigDecimal.TEN); assertEquals("Fluent Account", account.name()); assertEquals(BigDecimal.TEN, account.balance()); }

Remarquez comment les préfixes get et set ont disparu.

4. Accesseurs chaînés

Jetons maintenant un œil à l' option chain :

@Accessors(chain = true)

L' option chain nous donne des setters qui retournent ceci . Notez à nouveau que la valeur par défaut est true , mais nous la définirons explicitement pour plus de clarté.

Cela signifie que nous peut enchaîner plusieurs ensemble des opérations ensemble dans une déclaration.

Tirons parti de nos accesseurs fluides et changeons l' option de chaîne en true :

@Accessors(fluent = true, chain = true) @Getter @Setter public class ChainedFluentAccount { private String name; private BigDecimal balance; } 

Nous obtenons le même effet si nous omettons la chaîne et spécifions simplement:

@Accessors(fluent = true)

Et maintenant, voyons comment cela affecte notre cas de test:

@Test public void givenChainedFluentAccount_thenUseChainedFluentAccessors() { ChainedFluentAccount account = new ChainedFluentAccount() .name("Fluent Account") .balance(BigDecimal.TEN); assertEquals("Fluent Account", account.name()); assertEquals(BigDecimal.TEN, account.balance()); }

Remarquez comment la nouvelle instruction devient plus longue avec les setters enchaînés, supprimant un peu de passe-partout.

Ceci, bien sûr, est de savoir comment Lombok @Builder utilise la chaîne ed couramment accesseurs.

5. Accesseurs de préfixe

Et enfin, parfois, nos champs peuvent avoir une convention de dénomination différente de celle que nous aimerions exposer via des getters et des setters.

Considérons la classe suivante qui utilise la notation hongroise pour ses champs:

public class PrefixedAccount { private String sName; private BigDecimal bdBalance; }

Si nous devions exposer cela avec @Getter et @Setter , nous obtiendrions des méthodes comme getSName , qui n'est pas aussi lisible.

L' option prefix nous permet de dire à Lombok quels préfixes ignorer:

@Accessors(prefix = {"s", "bd"}) @Getter @Setter public class PrefixedAccount { private String sName; private BigDecimal bdBalance; }

Alors, voyons comment cela affecte notre cas de test:

@Test public void givenPrefixedAccount_thenRemovePrefixFromAccessors() { PrefixedAccount account = new PrefixedAccount(); account.setName("Prefixed Fields"); account.setBalance(BigDecimal.TEN); assertEquals("Prefixed Fields", account.getName()); assertEquals(BigDecimal.TEN, account.getBalance()); }

Notez que les accesseurs de notre champ sName ( setName, getName ) omettent les premiers s et les accesseurs de bdBalance omettent le bd de tête .

Cependant, Lombok n'applique les préfixes que lorsqu'un préfixe est suivi par autre chose qu'une lettre minuscule.

Cela garantit que si nous avons un champ qui n'utilise pas la notation hongroise, comme state, mais qui commence par l'un de nos préfixes, s , nous ne nous retrouvons pas avec getTate ()!

Enfin, disons que nous voulons utiliser des traits de soulignement dans notre notation, mais que nous voulons également le suivre avec une lettre minuscule.

Ajoutons un champ s_notes avec le préfixe s_:

@Accessors(prefix = "s_") private String s_notes;

En suivant la règle des lettres minuscules, nous obtiendrions des méthodes comme getS_Notes () , donc Lombok applique également des préfixes lorsqu'un préfixe lui-même se termine par quelque chose qui n'est pas une lettre .

6. Propriétés de configuration

Nous pouvons définir une valeur par défaut à l'échelle du projet ou du répertoire pour notre combinaison de paramètres préférée en ajoutant des propriétés de configuration à un fichier lombok.config :

lombok.accessors.chain=true lombok.accessors.fluent=true

Consultez le Guide de configuration des fonctionnalités de Lombok pour plus de détails.

7. Conclusion

Dans cet article, nous avons utilisé les options fluent, chaîne et préfixe de l' annotation @Accessors de Lombok dans diverses combinaisons pour voir comment cela affectait le code généré.

Pour en savoir plus, consultez le Guide des fonctionnalités JavaDoc et expérimentales des accessoires Lombok.

Comme d'habitude, la source de cet article est disponible à l'adresse over sur GitHub.