Статьи

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

Одной из наиболее часто высказываемых критических замечаний в отношении языка программирования Java является требуемый объем кода Boilerplate . Это особенно верно для простых классов, которые не должны делать ничего, кроме как хранить несколько значений. Для этих значений вам нужны геттеры и сеттеры, возможно, вам также нужен конструктор, переопределяющий equals () и
Часто требуется 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 в ваш путь к классам. Если вы используете Maven, вам просто нужно добавить следующую зависимость к вашему pom.xml:

1
2
3
4
5
6
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.14.6</version>
  <scope>provided</scope>
</dependency>

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

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

Начиная

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

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

01
02
03
04
05
06
07
08
09
10
11
@Getter
@Setter
public class Person {
  private final LocalDate birthday;
  private String firstName;
  private String lastName;
 
  public Person(LocalDate birthday) {
    this.birthday = birthday;
  }
}

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

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

1
2
3
4
5
@EqualsAndHashCode
@ToString
public class Person {
  ...
}

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

1
2
3
4
5
@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:

1
2
3
4
5
6
@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 есть несколько экспериментальных функций, которые можно найти на странице Экспериментальные функции .

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

1
2
3
4
5
6
@Builder
public class Person {
  private final LocalDate birthday;
  private String firstName;
  private String lastName;
}

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

1
2
3
4
5
Person p = Person.builder()
  .birthday(LocalDate.of(1980105))
  .firstName("John")
  .lastName("Smith")
  .build();

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

Вывод

Проект Lombok внедряет сгенерированные методы, такие как геттеры и сеттеры, на основе аннотаций. Он предоставляет простой способ значительно сократить объем кода Boilerplate в приложениях Java.

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

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