Проект Java Lombok

Проект 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:

  1. Скачайте jar с https://projectlombok.org/download или используйте jar, загруженный из вашей сборки Maven.
  2. Выполните команду в терминале: java -jar lombok.jar
  3. Эта команда откроет окно, как показано на рисунке ниже. Установите, закройте установщик и перезапустите Eclipse.

Если вы используете MacOS, то вот шаги для использования Lombok в вашем проекте.

  1. Скопируйте файл lombok.jar в каталог Eclipse.app/Contents/MacOS.
  2. Добавьте -javaagent:lombok.jar в конец файла Eclipse.app/Contents/Eclipse/eclipse.ini.
  3. Перезапустите Eclipse и включите “Аннотационную обработку” в свойствах проекта, как показано на изображении ниже.

Обзор Lombok в Eclipse

После установки давайте проверим, как мы можем увидеть наш уменьшенный шаблон кода? Я воссоздал тот же класс как PersonLombok. Обзор Eclipse, который отображает геттер и сеттер для имени. Это было сделано на основе аннотаций Lombok @Getter и @Setter установленных для экземплярной переменной firstName.

Обзор Lombok в Java байт-коде

Мы можем проверить добавление методов getter & setter для firstName из байт-кода класса.

Аннотации проекта Lombok

Проект Lombok предоставляет множество аннотаций, которые помогают уменьшить шаблонный код в различных сценариях. Давайте рассмотрим несколько из них.

  1. Аннотация Конструктора

    @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, которые не инициализированы там, где они объявлены.

  2. Аннотации Getter/Setter

    Эти аннотации могут использоваться как на уровне поля, так и на уровне класса. Если вам нужен тонкий контроль, используйте их на уровне поля. Если используется на уровне класса, создаются все методы getter/setter. Давайте поработаем с классом, который мы создали выше.

    @AllArgsConstructor @Getter @Setter
    public class PersonLombok {
    	String firstName;
    	String lastName;
    	LocalDate dateOfBirth;
    }
    
  3. Аннотации 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 и получить ту же функциональность.

  4. Аннотации на основе шаблона проектирования

    @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