Статьи

Сокращение кода Boilerplate в ваших Java-приложениях с помощью Project Lombok

Одной из наиболее часто высказываемых критических замечаний в отношении языка программирования Java является требуемый объем  кода Boilerplate  . Это особенно верно для простых классов, которые не должны делать ничего, кроме как хранить несколько значений. Вам нужны геттеры и сеттеры для этих значений, может быть, вам также нужен конструктор, часто требуются overridingequals () и hashcode (), и, возможно, вам нужна более полезная реализация toString (). В итоге у вас может быть 100 строк кода, которые можно переписать с помощью 10 строк  Scala  или Groovy. код. Java IDE, такие как Eclipse или IntelliJ, пытаются уменьшить эту проблему, предоставляя различные типы функций генерации кода. Однако, даже если вам не нужно писать код самостоятельно, вы всегда увидите его (и отвлечетесь им), если откроете такой файл в своей IDE.

Project Lombok  (не пугайтесь уродливой веб-страницы) — это небольшая библиотека Java, которая может помочь уменьшить объем кода Boilerplate в приложениях Java. Project Lombok предоставляет набор аннотаций, которые обрабатываются во время разработки для внедрения кода в ваше Java-приложение. Внедренный код сразу доступен в вашей среде разработки.
Давайте посмотрим на следующий скриншот Eclipse:

Определенный класс аннотируется аннотацией Lombok @Data и не содержит более трех закрытых полей. @Data автоматически внедряет методы получения, установки (для не конечных полей), equals (), hashCode (), toString () и конструктор для инициализации конечного поля dateOfBirth. Как вы можете видеть, сгенерированные методы напрямую доступны в Eclipse и показаны в представлении Outline.

Настройка
Чтобы настроить Lombok для вашего приложения, вы должны поместить lombok.jar в ваш classpath. Если вы используете Maven, вам просто нужно добавить следующую зависимость к вашему pom.xml:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.14.8</version>
    <scope>provided</scope>
</dependency>

Вам также нужно настроить Lombok в IDE, которую вы используете:

  • Пользователям NetBeans нужно просто включить параметр «  Включить обработку аннотаций в редакторе»  в свойствах своего проекта (см.  Инструкции NetBeans ).
  • Пользователи Eclipse могут установить Lombok, дважды щелкнув lombok.jar и следуя указаниям мастера быстрой установки.
  • Для IntelliJ   доступен плагин Lombok .

Начало
работы Аннотация @Data, показанная во введении, на самом деле является ярлыком для других аннотаций Lombok. Иногда @Data делает слишком много. В этом случае вы можете воспользоваться более конкретными аннотациями Lombok, которые обеспечивают большую гибкость.

Генерация только методов получения и установки может быть достигнута с помощью @Getter и @Setter:

@Getter
@Setter
public class Person {
    private final LocalDate birthday;
    private String firstName;
    private String lastName;
    public Person(LocalDate birthday) {
        this.birthday = birthday;
    }
}

Обратите внимание, что методы получения для логических полей имеют префикс is вместо get (например, isFoo () вместо getFoo ()). Если вы хотите генерировать методы получения и установки только для определенных полей, вы можете аннотировать эти поля вместо класса.

Генерация equals (), hashCode () и toString ():

@EqualsAndHashCode
@ToString
public class Person {
    ...
}

@EqualsAndHashCode и @ToString также имеют различные свойства, которые можно использовать для настройки их поведения:

@EqualsAndHashCode(exclude = {"firstName"})
@ToString(callSuper = true, of = {"firstName", "lastName"})
public class Person {
    ...
}

Здесь поле firstName не будет рассматриваться equals () и hashCode ().
toString () будет вызывать super.toString () первым и учитывать только firstName и lastName.

Для создания конструктора доступно несколько аннотаций:

  • @NoArgsConstructor генерирует конструктор без аргументов (конструктор по умолчанию).
  • @RequiredArgsConstructor генерирует конструктор с одним параметром для всех неинициализированных конечных полей.
  • @AllArgsConstructor генерирует конструктор с одним параметром для всех полей в классе.

Аннотация @Data — это часто используемый ярлык для @ToString, @EqualsAndHashCode, @ Getter, @ Setter и @RequiredArgsConstructor.

Если вы предпочитаете неизменяемые классы, вы можете использовать @Value вместо @Data:

@Value
public class Person {
    LocalDate birthday;
    String firstName;
    String lastName;
}

@Value — это ярлык для @ToString, @EqualsAndHashCode, @ AllArgsConstructor, @ FieldDefaults (makeFinal = true, level = AccessLevel.PRIVATE) и @Getter.

Итак, с @Value вы получаете toString (), equals (), hashCode (), геттеры и конструктор с одним параметром для каждого поля. Он также делает все поля приватными и окончательными по умолчанию, поэтому вам не нужно добавлять частные или окончательные модификаторы. 

Изучение экспериментальных возможностей Lombok
Помимо хорошо поддерживаемых аннотаций, показанных до сих пор, у Lombok есть несколько экспериментальных функций, которые можно найти на   странице Experimental Features .

В частности, мне нравится одна из этих функций — аннотация @Builder, которая обеспечивает реализацию  шаблона Builder .

@Builder
public class Person {
    private final LocalDate birthday;
    private String firstName;
    private String lastName;
}

@Builder генерирует статический метод builder (), который возвращает экземпляр построителя. Этот экземпляр компоновщика можно использовать для создания объекта класса, аннотированного @Builder (здесь Person):

Person p = Person.builder()
    .birthday(LocalDate.of(1980, 10, 5))
    .firstName("John")
    .lastName("Smith")
    .build();

Кстати, если вам интересно, что это за класс LocalDate, вам следует взглянуть на мой пост в блоге об API даты и времени Java 8  ?

Заключение
Проект Lombok внедряет сгенерированные методы, такие как методы получения и установки, на основе аннотаций. Он предоставляет простой способ значительно сократить объем кода Boilerplate в приложениях Java. 
Имейте в виду, что есть недостаток: согласно  комментариям reddit (включая комментарий автора проекта), Lombok должен полагаться на различные хаки, чтобы выполнить свою работу. Таким образом, есть вероятность, что будущие выпуски JDK или IDE нарушат функциональность проекта Lombok. С другой стороны, эти комментарии были сделаны 5 лет назад, и Project Lombok все еще активно поддерживается.

Вы можете найти источник Project Lombok на  GitHub