Lombok @Value — лёгкое создание неизменяемых классов

Цикл статей «Project Lombok».

Следующая статья — «Lombok @Builder».
Предыдущая статья — «Lombok @Data».

Аннотация @Value впервые появилась в качестве экспериментальной возможности в Lombok v0.11.4.

@Value больше не предполагает @Wither с lombok v0.11.8.

@Value продвинулась в основной пакет Lombok с Lombok v0.12.0.

@Value — это неизменяемый вариант @Data. Все поля делаются приватными и final по умолчанию, методы установки значений не генерируются. Класс тоже делается final, потому что неизменяемость — это не то, что распространяется на подклассы. Так же как и в @Data, методы toString(), equals() и hashCode() methods генерируются, каждое поле получает метод получения значения, генерируется конструктор, покрывающий все аргументы (кроме полей final, инициализированных при объявлении).

Практически @Value является сокращением для final @ToString @EqualsAndHashCode @AllArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter, кроме того, что при явном включении реализации любого из методов эта часть не будет генерироваться, и никаких ошибок и предупреждений возникать не будет. Например, если вы напишете свой метод toString, то никаких ошибок возникать не будет, и Lombok не будет генерировать toString. Также любой явный конструктор, независимо от списка аргументов, подразумевает, что Lombok не будет генерировать конструктор. Если вы хотите, чтобы Lombok генерировал конструктор со всеми полями, то добавьте @AllArgsConstructor к классу. Вы можете пометить любой конструктор или метод аннотацией @lombok.experimental.Tolerate, чтобы скрыть их от Lombok.

Можно переопределить final-по-умолчанию и private-по-умолчанию с помощью явного указания уровня доступа для поля или с помощью аннотаций @NonFinal или @PackagePrivate.

Можно переопределить любое поведение любой «части» @Value с помощью явного указания соответствующих аннотаций.

С помощью Lombok

Чистая Java

Поддерживаемые ключи конфигурации

Lombok будет помечать любое использование @Value предупреждением или ошибкой, если настроено.

Примечание

Смотрите статьи про «части» @Value: @ToString, @EqualsAndHashCode, @AllArgsConstructor, @FieldDefaults, and @Getter.

Для классов с шаблонами полезно иметь статический метод, который действует как конструктор, потому что вывод параметров шаблона для статических методов работает в Java6 и исключает необходимость использования оператора <>. Вы можете сделать это с помощью явного указания @AllArgsConstructor(staticConstructor="of"), и также есть @Value(staticConstructor="of"), которые делает конструктор со всеми аргументами приватным и генерирует публичный статический метод с именем of, который оборачивается вокруг приватного конструктора.

Аннотация @Value была экспериментальной возможностью с v0.11.4 по v0.11.9 (как @lombok.experimental.Value). С тех пор она переместилась в основной пакет. Старая аннотация всё ещё есть, но со временем она будет удалена.

Можно использовать @FieldDefaults, чтобы отменить private-по-умолчанию и final-по-умолчанию для полей класса. Используйте @NonFinal и @PackagePrivate для полей класса, чтобы переопределить это поведение.

 

Цикл статей «Project Lombok».

Следующая статья — «Lombok @Builder».
Предыдущая статья — «Lombok @Data».

Lombok @Value — лёгкое создание неизменяемых классов: 2 комментария

  1. Ошибка в: «Например, если вы напишете свой метод toString, то никаких ошибок возникать не будет, и Lombok будет генерировать toString.»
    Должно быть: «Например, если вы напишете свой метод toString, то никаких ошибок возникать не будет, и Lombok НЕ будет генерировать toString.»
    Оригинал: «For example, if you write your own toString, no error occurs, and lombok will not generate a toString.»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *