Usando a anotação @Accessors da Lombok

Usando a anotação @Accessors da Lombok

1. Visão geral

É bastante comum ter métodosgeteset em nossos objetos de domínio, mas existem outras maneiras que podemos achar mais expressivas.

Neste tutorial, aprenderemos sobreProject Lombok's@Accessors annotation e seu suporte para acessores fluentes, encadeados e personalizados.

Antes de continuar, porém, nossoIDE will need Lombok installed.

2. Acessores padrão

Antes de olharmos para a anotação@Accessors,let’s review how Lombok treats the @Getter and @Setter annotations by default.

Primeiro, vamos criar nossa classe:

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

E agora vamos criar um caso de teste. Podemos ver em nosso teste que Lombok adicionou métodos getter e setter típicos:

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

Veremos como esse caso de teste muda conforme olhamos as opções de@Accessor.

3. Acessadores fluentes

Vamos começar com a opçãofluent:

@Accessors(fluent = true)

A opçãofluent nos dá acessadores que não têm um prefixoget ouset.

Vamos dar uma olhada na opçãochain em um momento, mas como ela está habilitada por padrão, vamos desabilitá-la explicitamente por enquanto:

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

Agora, nosso teste ainda se comporta da mesma forma, mas mudamos a maneira como acessamos e alteramos o estado:

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

Observe como os prefixosget and set desapareceram.

4. Acessores encadeados

Agora vamos dar uma olhada na opçãochain:

@Accessors(chain = true)

The chain option gives us setters that return*this*.  Mais uma vez, observe que o padrão étrue, mas vamos defini-lo explicitamente para maior clareza.

Isso significa que podemos encadear várias operaçõesset em uma instrução.

Vamos construir sobre nossos acessoresfluent e mudar a opçãochain paratrue:

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

Obteremos o mesmo efeito se deixarmoschaine apenas especificarmos:

@Accessors(fluent = true)

E agora vamos ver como isso afeta nosso caso de teste:

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

Observe como a instruçãonew fica mais longa com ossetters encadeados, removendo alguns clichês.

Obviamente, é assim queLombok’s @Builder usachainedfluent acessores.

5. Acessadores de prefixo

E, finalmente, às vezes, nossos campos podem ter uma convenção de nomenclatura diferente daquela que gostaríamos de expor por meio de getters e setters.

Vamos considerar a seguinte classe que usa notação húngara para seus campos:

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

Se fôssemos expor isso com@Gettere@Setter, obteríamos métodos comogetSName, que não é tão legível.

A opçãoprefix nos permite informar ao Lombok quais prefixos devem ser ignorados:

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

Então, vamos ver como isso afeta nosso caso de teste:

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

Observe como os acessores para nosso camposName (setName,getName) omitem oss principais e os acessores parabdBalance omitem osbd principais.

No entanto, Lombokonly applies prefixes when a prefix is followed by something other than a lowercase letter.

Isso garante que, se tivermos um campo que não está usando notação húngara, comostate,, mas começar com um de nossos prefixos,s, não terminaremos comgetTate()!

Por último, digamos que queremos usar sublinhados em nossa notação, mas também queremos seguir com uma letra minúscula.

Vamos adicionar um campos_notes com prefixos: _

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

Seguindo a regra da letra minúscula, obteríamos métodos comogetS_Notes(), entãoLombok also applies prefixes when a prefix itself ends in something that isn’t a letter.

6. Propriedades de configuração

Podemos definir um padrão para todo o projeto ou diretório para nossa combinação favorita de configurações, adicionando propriedades de configuração a um arquivolombok.config:

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

Consulte o LombokFeature Configuration Guide para obter mais detalhes.

7. Conclusão

Neste artigo, usamos as opçõesfluent, chain,eprefix da anotação@Accessors do Lombok em várias combinações para ver como isso afetou o código gerado.

Para saber mais, dê uma olhada emLombok Accessors JavaDoceExperimental Feature Guide.

Como de costume, a fonte deste artigo está disponívelover on GitHub.