Java сильно критикуют и ненавидят за многословие. Даже для таких вещей, как чтение/запись файлов, мы должны церемонно писать много общих вещей. Набирающая популярность библиотека Java Lombok успешно решает эту проблему. Это Java-библиотека на основе аннотаций, которая подключается к редакторам, IDE и инструментам сборки во время компиляции, облегчая создание стандартного кода и делая код чистым и более читабельным. В этой библиотеке много функций и аннотаций, но чтобы проиллюстрировать, насколько полезной она оказалась для меня в повседневной работе, я расскажу о @Data аннотации.

Допустим, у нас есть POJO (обычный старый объект Java) для представления каких-то данных в нашей программе. Используя ванильную Java, мы получаем следующее:

public class Person {
    private String id,name,nationality;
public Person(String id, String name, String nationality) {
        this.id = id;
        this.name = name;
        this.nationality = nationality;
    }
public String getId() {
        return id;
    }
public void setId(String id) {
        this.id = id;
    }
public String getName() {
        return name;
    }
public void setName(String name) {
        this.name = name;
    }
public String getNationality() {
        return nationality;
    }
public void setNationality(String nationality) {
        this.nationality = nationality;
    }
//override equals, hashCode,toString
}

В этом коде нет ничего плохого. Многие из этих шаблонных кодов также могут быть сгенерированы с помощью внутренних инструментов IDE. Но прохождение этого кода не является приятным занятием. Это просто класс Data или в него встроены какие-то специальные методы? Теперь давайте напишем то же самое, используя @Data.

import lombok.Data;
@Data
public class Person {
    private String id,name,nationality;
}

Да, это так. @Data аннотация создает для нас геттеры, сеттеры, конструкторы, переопределяет equals, hashCode и toString. Код теперь очень чистый и читабельный, не запутанный. Чтобы это работало, нам нужно импортировать библиотеку Lombok (jar, Gradle и Maven) и на основе IDE включить обработку аннотаций. Например, в IntelliJ:

После аннотирования класса Java мы можем проверить, что было вставлено, используя javap дизассемблер или инструмент IDE под названием Delombok.

Для нашего приведенного выше примера:

//generated using delombok tool of  Intellij IDEA
public class Person {
    private String id,name,nationality;
public Person() {
    }
public String getId() {
        return this.id;
    }
public String getName() {
        return this.name;
    }
public String getNationality() {
        return this.nationality;
    }
public void setId(String id) {
        this.id = id;
    }
public void setName(String name) {
        this.name = name;
    }
public void setNationality(String nationality) {
        this.nationality = nationality;
    }
public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof Person))
            return false;
        final Person other = (Person) o;
        if (!other.canEqual((Object) this))
            return false;
        final Object this$id = this.getId();
        final Object other$id = other.getId();
        if (this$id == null ? other$id != null : !this$id.equals(other$id))
            return false;
        final Object this$name = this.getName();
        final Object other$name = other.getName();
        if (this$name == null ? other$name != null : !this$name.equals(other$name))
            return false;
        final Object this$nationality = this.getNationality();
        final Object other$nationality = other.getNationality();
        if (this$nationality == null ? other$nationality != null : !this$nationality.equals(other$nationality))
            return false;
        return true;
    }
public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        final Object $id = this.getId();
        result = result * PRIME + ($id == null ? 43 : $id.hashCode());
        final Object $name = this.getName();
        result = result * PRIME + ($name == null ? 43 : $name.hashCode());
        final Object $nationality = this.getNationality();
        result = result * PRIME + ($nationality == null ? 43 : $nationality.hashCode());
        return result;
    }
protected boolean canEqual(Object other) {
        return other instanceof Person;
    }
public String toString() {
        return "Person(id=" + this.getId() + ", name=" + this.getName() + ", nationality=" + this.getNationality() +
                ")";
    }
}

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

Также опубликовано в Dzone