Utilizzo dell'annotazione @Accessors di Lombok

1. Panoramica

È abbastanza tipico avere metodi get e set nei nostri oggetti di dominio, ma ci sono altri modi che possiamo trovare più espressivi.

In questo tutorial, impareremo a conoscere l' annotazione @Accessors di Project Lombok e il suo supporto per funzioni di accesso fluide , concatenate e personalizzate.

Prima di continuare, però, il nostro IDE avrà bisogno di Lombok installato.

2. Accessori standard

Prima di esaminare l' annotazione @Accessors , esaminiamo come Lombok tratta le annotazioni @Getter e @Setter per impostazione predefinita.

Per prima cosa, creiamo la nostra classe:

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

E ora creiamo un test case. Possiamo vedere nel nostro test che Lombok ha aggiunto i tipici metodi getter e setter:

@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()); }

Vedremo come cambia questo caso di test guardando le opzioni di @Accessor .

3. Accessori fluenti

Cominciamo con l' opzione fluente :

@Accessors(fluent = true)

L' opzione fluente ci offre funzioni di accesso che non hanno un prefisso get o set .

Daremo un'occhiata all'opzione della catena tra un momento, ma poiché è abilitata per impostazione predefinita, disabilitiamola esplicitamente per ora:

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

Ora, il nostro test si comporta ancora allo stesso modo, ma abbiamo cambiato il modo in cui accediamo e mutiamo lo stato:

@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()); }

Notare come i prefissi get e set sono scomparsi.

4. Accessori concatenati

Ora diamo un'occhiata all'opzione catena :

@Accessors(chain = true)

L' opzione chain ci dà setter che restituiscono questo . Notate di nuovo che il valore predefinito è true , ma lo imposteremo esplicitamente per chiarezza.

Ciò significa che possiamo concatenare più operazioni sugli insiemi in un'unica istruzione.

Costruiamo sui nostri strumenti di accesso fluenti e cambiamo l' opzione della catena su true :

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

Otteniamo lo stesso effetto se tralasciamo la catena e specifichiamo semplicemente:

@Accessors(fluent = true)

E ora vediamo come questo influisce sul nostro test case:

@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()); }

Notare come la nuova istruzione si allunga con i setter incatenati insieme, rimuovendo alcuni boilerplate.

Questo, naturalmente, è il modo di Lombok @Builder fa uso di catena Ed fluenti di accesso.

5. Funzioni di accesso del prefisso

E infine, a volte i nostri campi possono avere una convenzione di denominazione diversa da quella che vorremmo esporre tramite getter e setter.

Consideriamo la seguente classe che utilizza la notazione ungherese per i suoi campi:

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

Se dovessimo esporlo con @Getter e @Setter , otterremmo metodi come getSName , che non è altrettanto leggibile.

L' opzione prefisso ci consente di dire a Lombok quali prefissi ignorare:

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

Quindi, vediamo come questo influisce sul nostro test case:

@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()); }

Si noti come le funzioni di accesso per il nostro sName campo ( setName, getName ) omettere lo s e le funzioni di accesso per bdBalance omettere lo bd .

Tuttavia, Lombok applica i prefissi solo quando un prefisso è seguito da qualcosa di diverso da una lettera minuscola.

Questo assicura che se abbiamo un campo che non utilizza la notazione ungherese, come state, ma inizia con uno dei nostri prefissi, s , non finiamo con getTate ()!

Infine, diciamo di voler usare i trattini bassi nella nostra notazione ma anche di seguirlo con una lettera minuscola.

Aggiungiamo un campo s_notes con prefisso s_:

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

Seguendo la regola delle lettere minuscole avremmo metodi come getS_Notes () , quindi Lombok applica anche i prefissi quando un prefisso stesso termina con qualcosa che non è una lettera .

6. Proprietà di configurazione

Possiamo impostare un valore predefinito a livello di progetto o directory per la nostra combinazione di impostazioni preferita aggiungendo proprietà di configurazione a un file lombok.config :

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

Vedere la Guida alla configurazione delle funzioni di Lombok per ulteriori dettagli.

7. Conclusione

In questo articolo, abbiamo utilizzato le opzioni fluente, concatenata e prefisso dell'annotazione @Accessors di Lombok in varie combinazioni per vedere come ha influenzato il codice generato.

Per saperne di più, assicurati di dare un'occhiata a Lombok Accessors JavaDoc and Experimental Feature Guide.

Come al solito, la fonte di questo articolo è disponibile su GitHub.