Използване на @Accessors Annotation на Lombok

1. Общ преглед

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

В този урок ще научим за анотацията @Accessors на Project Lombok и нейната поддръжка за плавни, верижни и персонализирани достъп.

Преди да продължи обаче, нашата IDE ще се нуждае от инсталиран Lombok.

2. Стандартни аксесоари

Преди да разгледаме анотацията @Accessors , нека прегледаме как Lombok третира анотациите @Getter и @Setter по подразбиране.

Първо, нека създадем нашия клас:

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

А сега нека създадем тестов случай. В нашия тест можем да видим, че Lombok е добавил типични методи за гетер и сетер:

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

Ще видим как ще се промени този тестов случай, докато разглеждаме опциите на @Accessor .

3. Плавни аксесоари

Нека започнем с плавната опция:

@Accessors(fluent = true)

В перфектен вариант ни дава средства за достъп, които не разполагат с GET или набор префикс.

Ще разгледаме опцията за веригата след малко, но тъй като е активирана по подразбиране, нека я деактивираме изрично засега:

@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. Верижни аксесоари

Сега да разгледаме опцията верига :

@Accessors(chain = true)

Опцията верига ни дава сетери, които връщат това . Отново имайте предвид, че по подразбиране е вярно , но ние ще го зададем изрично за яснота.

Това означава, че може да приковават няколко определени операции на едно твърдение.

Нека надградим върху нашите плавни аксесоари и променим опцията на веригата на 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()); }

Забележете как новото извлечение става по-дълго с монтираните вериги заедно, премахвайки някои бойлери.

Това, разбира се, е как Ломбок на @Builder използва верига изд владеят средства за достъп.

5. Префикс Аксесоари

И накрая, понякога нашите полета могат да имат различна конвенция за именуване, отколкото бихме искали да изложим чрез getters и setters.

Нека разгледаме следния клас, който използва унгарски нотация за своите полета:

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

Ако трябваше да изложим това с @Getter и @Setter , щяхме да получим методи като getSName , което не е толкова четимо.

Опцията за префикс ни позволява да кажем на Lombok кои префикси да се игнорират:

@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, а аксесоарите за bdBalance пропускат водещия bd .

Lombok обаче прилага префиксите само когато префиксът е последван от нещо различно от малка буква.

Това гарантира, че ако имаме поле, което не използва унгарски нотации, като състояние, но започва с един от нашите префикси, 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. Заключение

В тази статия използвахме плавните опции , веригата и префиксните опции на анотацията @Accessors на Lombok в различни комбинации, за да видим как тя влияе върху генерирания код.

За да научите повече, не забравяйте да разгледате ръководството JavaDoc и експерименталните функции на Lombok Accessors.

Както обикновено, източникът на тази статия е достъпен в GitHub.