Рубрики
Без рубрики

Использование аннотации @Accessors Ломбока

Узнайте о аннотации Project Lombok @Accessors и ее поддержке для fluent, chained и пользовательских методов доступа.

Автор оригинала: baeldung.

1. Обзор

Довольно типично иметь get и set методы в наших предметных объектах, но есть и другие способы, которые мы можем найти более выразительными.

В этом уроке мы узнаем о Project Lombok ‘s @Accessories аннотации и его поддержке свободных, цепных и пользовательских методов доступа.

Однако, прежде чем продолжить, нашей IDE потребуется установить Lombok .

2. Стандартные аксессуары

Прежде чем мы рассмотрим аннотации @Accessors , давайте рассмотрим, как Ломбок обрабатывает аннотации @Getter и @Setter по умолчанию.

Во-первых, давайте создадим наш класс:

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

А теперь давайте создадим тестовый случай. В нашем тесте мы видим, что Ломбок добавил типичные методы получения и установки:

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

Мы увидим, как изменится этот тестовый случай, когда мы посмотрим на @@Аксессуар варианты.

3. Плавные аксессуары

Давайте начнем с опции fluent :

@Accessors(fluent = true)

То беглый опция дает нам средства доступа, которые не имеют получить или набор префикс.

Сейчас мы рассмотрим опцию chain , но поскольку она включена по умолчанию, давайте пока отключим ее явно:

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

Теперь наш тест по-прежнему ведет себя так же, но мы изменили способ доступа и изменения состояния:

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

Обратите внимание, как исчезли префиксы get и set .

4. Цепные Аксессоры

Теперь давайте взглянем на опцию chain :

@Accessors(chain = true)

Опция chain дает нам сеттеры, которые возвращают this . Еще раз обратите внимание , что по умолчанию он имеет значение true , но мы установим его явно для ясности.

Это означает, что мы можем объединить несколько операций set в одном операторе.

Давайте опираться на наши fluent аксессоры и изменим параметр chain на true :

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

Мы получим тот же эффект, если опустим цепочку и просто укажем:

@Accessors(fluent = true)

А теперь давайте посмотрим, как это повлияет на наш тестовый случай:

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

Обратите внимание, как оператор new становится длиннее с помощью сеттеров , связанных вместе, удаляя некоторые шаблонные шаблоны.

Это, конечно, то, как Lombok @Builder использует chain ed fluent accessors.

5. Префиксные методы доступа

И, наконец, иногда наши поля могут иметь другое соглашение об именовании, чем мы хотели бы представить с помощью геттеров и сеттеров.

Давайте рассмотрим следующий класс, который использует венгерскую нотацию для своих полей:

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

Если бы мы раскрыли это с помощью @Getter и @Setter , мы получили бы такие методы , как getname , которые не так удобочитаемы.

Опция prefix позволяет нам указать Ломбоку, какие префиксы следует игнорировать:

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

Итак, давайте посмотрим, как это повлияет на наш тестовый случай:

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

Обратите внимание, как средства доступа для нашего поля sName ( setName, | getName ) пропускают начало s , а средства доступа для dbbalance пропускают начало bd .

Однако Lombok применяет префиксы только тогда, когда за префиксом следует что-то другое, кроме строчной буквы.

Это гарантирует, что если у нас есть поле, которое не использует венгерскую нотацию, например state, , но начинается с одного из наших префиксов s , мы не получим getTate()!

Наконец, предположим, что мы хотим использовать подчеркивания в нашей нотации, но также хотим следовать за ней строчной буквой.

Давайте добавим поле s_notes с префиксом s_:

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

Следуя правилу строчных букв , мы получим такие методы, как getS_Notes () , поэтому Lombok также применяет префиксы, когда сам префикс заканчивается чем-то, что не является буквой .

6. Свойства конфигурации

Мы можем установить значение по умолчанию для проекта или каталога для вашей любимой комбинации настроек, добавив свойства конфигурации в файл lombok.config :

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

Дополнительные сведения см. в Руководстве по настройке функций Lombok /.

7. Заключение

В этой статье мы использовали fluent, chain, и prefix опции аннотации Lombok @Accessors в различных комбинациях, чтобы увидеть, как это повлияло на сгенерированный код.

Чтобы узнать больше, обязательно ознакомьтесь с Lombok Accessors JavaDoc и Руководство по экспериментальным функциям .

Как обычно, источник этой статьи доступен на GitHub .