Проект Lombok – очень полезный инструмент для проектов на Java, который позволяет сократить количество шаблонного кода.
Постановка Проблемы
В дебатах между Java и другими языками, первый аргумент, который вы слышите от сторонников других языков, заключается в том, что Java требует много шаблонного кода, и вы просто не можете от этого избавиться, вы бессильны. Та же проблема отмечается на различных платформах и в сообществах разработчиков. Давайте посмотрим на пример кода с шаблонным кодом.
package com.askrakesh.java.manage_boilerplate;
import java.time.LocalDate;
public class Person {
String firstName;
String lastName;
LocalDate dateOfBirth;
public Person(String firstName, String lastName, LocalDate dateOfBirth) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.dateOfBirth = dateOfBirth;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public LocalDate getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(LocalDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dateOfBirth == null) ? 0 : dateOfBirth.hashCode());
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (dateOfBirth == null) {
if (other.dateOfBirth != null)
return false;
} else if (!dateOfBirth.equals(other.dateOfBirth))
return false;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
return true;
}
@Override
public String toString() {
return "Person [firstName=" + firstName + ", lastName=" + lastName + "dateOfBirth=" + dateOfBirth + "]";
}
}
A class should have getter-setters for the instance variables, equals
& hashCode
method implementation, all field constructors and an implementation of toString
method. This class so far has no business logic and even without it is 80+ lines of code. This is insane.
Проект Lombok
Проект Lombok – это библиотека Java, которая автоматически подключается к вашему редактору и средствам сборки и помогает уменьшить количество шаблонного кода. Давайте сначала посмотрим, как настроить проект Lombok.
Как работает Java Project Lombok?
Ломбок имеет различные аннотации, которые могут быть использованы в нашем коде, обрабатываемом во время компиляции, и в зависимости от использованной аннотации будет выполняться соответствующее расширение кода. Ломбок выполняет сокращение кода только во время просмотра, после компиляции байт-код внедряется весь шаблон. Это помогает поддерживать наш кодовую базу небольшой, чистой и легкой для чтения и обслуживания.
Проект Lombok Maven
Добавление Ломбока в ваш проект просто. Просто добавьте следующую зависимость в файл pom.xml вашего проекта Maven.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
Добавление плагина Lombok в IDE (Eclipse)
Вот шаги установки для Windows:
- Скачайте jar с https://projectlombok.org/download или используйте jar, загруженный из вашей сборки Maven.
- Выполните команду в терминале:
java -jar lombok.jar
- Эта команда откроет окно, как показано на рисунке ниже. Установите, закройте установщик и перезапустите Eclipse.
Если вы используете MacOS, то вот шаги для использования Lombok в вашем проекте.
- Скопируйте файл lombok.jar в каталог
Eclipse.app/Contents/MacOS
. - Добавьте
-javaagent:lombok.jar
в конец файлаEclipse.app/Contents/Eclipse/eclipse.ini
. - Перезапустите Eclipse и включите “Аннотационную обработку” в свойствах проекта, как показано на изображении ниже.
Обзор Lombok в Eclipse
После установки давайте проверим, как мы можем увидеть наш уменьшенный шаблон кода? Я воссоздал тот же класс как PersonLombok
. Обзор Eclipse, который отображает геттер и сеттер для имени. Это было сделано на основе аннотаций Lombok @Getter
и @Setter
установленных для экземплярной переменной firstName.
Обзор Lombok в Java байт-коде
Мы можем проверить добавление методов getter & setter для firstName из байт-кода класса.
Аннотации проекта Lombok
Проект Lombok предоставляет множество аннотаций, которые помогают уменьшить шаблонный код в различных сценариях. Давайте рассмотрим несколько из них.
-
Аннотация Конструктора
@AllArgsConstructor public class PersonLombok { @NonNull String firstName; String lastName; LocalDate dateOfBirth; public static void main(String[] args) { new PersonLombok(null, "Kumar", LocalDate.now()); } }
В приведенном выше коде в класс внедряется следующее:
- Конструктор со всеми аргументами с помощью @AllArgsConstructor
- Проверка на null при передаче аргумента в конструкторе с помощью @NonNull. Аннотация @NonNull также может использоваться при передаче аргумента в качестве параметра метода
Вот результат выполнения программы.
@RequiredArgsConstructor
создает конструктор с 1 параметром для каждого поля, требующего особой обработки. Все неинициализированные финальные поля получают параметр, а также любые поля, помеченные как@NonNull
, которые не инициализированы там, где они объявлены. -
Аннотации Getter/Setter
Эти аннотации могут использоваться как на уровне поля, так и на уровне класса. Если вам нужен тонкий контроль, используйте их на уровне поля. Если используется на уровне класса, создаются все методы getter/setter. Давайте поработаем с классом, который мы создали выше.
@AllArgsConstructor @Getter @Setter public class PersonLombok { String firstName; String lastName; LocalDate dateOfBirth; }
-
Аннотации equals, hashCode и toString
Рекомендуется переопределить методы
hashCode()
иequals()
при создании класса. В Lombok у нас есть аннотация@EqualsAndHashCode
, которая внедряет код для методов equals() и hashCode(), так как они идут вместе. Кроме того, аннотация@ToString
предоставляет реализацию toString(). Давайте посмотрим на это:@AllArgsConstructor @Getter @Setter @EqualsAndHashCode @ToString public class PersonLombok { String firstName; String lastName; LocalDate dateOfBirth; }
Теперь мы создали класс Person без какого-либо стандартного кода благодаря аннотациям Lombok. Однако становится еще лучше, мы можем заменить все аннотации, использованные в приведенном выше классе, на
@Data
и получить ту же функциональность. -
Аннотации на основе шаблона проектирования
@Builder
позволяет автоматически создавать код, необходимый для того, чтобы ваш класс можно было создать с использованием шаблона строителя.@Builder public class Employee { String firstName; String lastName; LocalDate dateOfBirth; public static void main(String[] args) { Employee emp = new EmployeeBuilder().firstName("Ракеш") .lastName("Кумар") .dateOfBirth(LocalDate.now()) .build(); } }
@Delegate
генерирует делегированные методы, которые перенаправляют вызов на это поле, для которого используется аннотация. “Предпочтительнее композиция перед наследованием“, но это создает много шаблонного кода, аналогичного шаблону адаптера. Lombok взял подсказку из аннотации Groovy с тем же именем при реализации этой функциональности. Давайте посмотрим на реализацию:@RequiredArgsConstructor public class AdapterImpl implements Adapter { @Delegate private final Adaptee instance; public static void main(String[] args) { AdapterImpl impl = new AdapterImpl(new Adaptee()); impl.display(); } } interface Adapter { public void display(); } class Adaptee { public void display() { System.out.println("В Adaptee.display()"); } }
Lombok предоставляет функциональность для тонкой настройки во всех аннотациях.
Шаблонный код: Слушают ли архитекторы Java?
Да, это так. Вам нужно понимать, что, в отличие от других языков, Java уделяет максимальное внимание обновлению языка так, чтобы не нарушить существующую кодовую базу, которая используется в более старых версиях Java. Это само по себе огромная задача и не должна быть недооценена. Они уже модифицируют и улучшают возможности вывода типов в языке, которые уже выпущены. Одной из важных функций, запланированных для Java 10, является Вывод типа локальной переменной. Хотя эта функция больше связана с добавлением динамической типизации, чем с шаблоном, но это всего лишь капля в океане управления шаблонным кодом.
Сводка
Уменьшение количества шаблонного кода способствует лучшей читаемости, меньший объем кода также означает меньше ошибок. Проект Lombok сегодня широко используется практически во всех крупных организациях. Мы предоставили вам наиболее полезные функции из Lombok. Надеемся, вы попробуете. Исходный код: Вы можете посетить мою ссылку на GitHub, чтобы скачать полный исходный код, использованный в этом руководстве.
Source:
https://www.digitalocean.com/community/tutorials/java-project-lombok