JavaRush /Java блог /Random UA /Анотації. Частина друга. Lombok

Анотації. Частина друга. Lombok

Стаття з групи Random UA
Анотації. Частина перша, трохи нудна У цій частині я вирішив торкнутися бібліотеки Lombok як відомого представника Source анотацій. З Runtime анотаціями у наступній статті. Жив був java програміст, щодня він писав звичайний код, наприклад такий:
package lombok;

public class Chelovek {
    private String name;
    private int age;

    public Chelovek(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Chelovek() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Chelovek chelovek = (Chelovek) o;

        if (age != chelovek.age) return false;
        return name != null ? name.equals(chelovek.name) : chelovek.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    @Override
    public String toString() {
        return "Chelovek{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
Звичайний такий клас, всього 2 поля (адже буває і більше 10-15 полів). Так звичайно це все можна генерувати в IDE, але млинець, воно займає місце. Якщо полів 15-20, до всіх потрібні гетери, сетери, конструктори ... Серед усього цього легко може загубитися кілька методів, непомітних оку. Як допомогти такому програмісту, щоб писав швидше та менше? Ломбок. Відразу в пекло, той же клас але з використанням ломбока:
package lombok;

@Data
public class Chelovek {
    private String name;
    private int age;
}
Та це все. Прикольно? Що зробить інструкція @Data ? Вона на етапі компіляції згенерує гетери\сетери для всіх полів, toString і перевизначить equals і hashCode за стандартами. У IDE можна встановити плагін і він бачитиме все ще не створені методи.
Анотації.  Частина друга.  Lombok - 1
Сподіваюся тут тобі, читачу, стало цікаво, бо далі буде коротка вступна та посилання на подробиці. Ломбок так само надає можливість кастомізувати генерацію, не завжди потрібні всі гетери, сеттери або хешкод треба генерувати по-іншому. Тому є окремі інструкції (думаю, багато хто з них опису не потребують) @Getter/@Setter @ToString @EqualsAndHashCode @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor @Log Це найбільш типові, весь набір можна подивитися тут Особливої ​​уваги гідний var і val. Це можливість писати так:
package lombok;

import lombok.experimental.var;

@Data
public class Chelovek {
    private String name;
    private int age;

    public static void main(String[] args) {
        var chelovek = new Chelovek();
        chelovek.setAge(22);
        System.out.println(chelovek);
    }
}
Навіщо це потрібно? Наприклад, у нас є клас RandomAccessFileChannel Ну, навіщо нам писати так:
RandomAccessFileChannel channel = new RandomAccessFileChannel();
Якщо можна так:
var channel2 = new RandomAccessFileChannel();
На мою думку, це не завжди прийнятно. Наприклад, у нас є злий метод, який повертає злу карту:
public static Map<List<Set<Integer>>, Set<List<String>>> evilMap(){
    return new HashMap<>();
}
якщо викликати його так:
Map<List<Set<Integer>>, Set<List<String>>> listSetMap = evilMap();
То більш-менш зрозуміло з чим ми працюємо. Якщо ж виклик такий:
var listSetMap = evilMap();
то хрін знає, що там повертає evilMap(), і поки не подивишся в сам метод, не впізнаєш. А навіщо бігати вихідниками? Загалом, із цим треба бути акуратнішими. Експериментальна гілка: Тут хочу відзначити анотації: @UtilityClass Вона створює приватний конструктор і там кидає exception (щоб брудні ручки від рефлексії не лізли сюди). І дуже красиво на початку класу повідомляє нам, що тут утилітні методи. @Delegate Реалізує шаблон делегування. Якщо у тебе є клас, який щось делегує іншому класу, при цьому вносить зміни лише в деякі методи, ця анотація позбавить тебе дублювання методів + стежитиме за ними. Якщо метод видалабо або додали, це помітить. Гілка експериментальних анотацій GITHUB Офіційний сайт Для того, щоб IDE нормально працювала з lombok, і не наголошувала на методах як неіснуючі, треба встановити плагін. На офіційному сайті, є розділ setup в якому можна подивитися як підключити плагін для кожної IDE Як можна помітити популярний ломбок. >5000 зірок і >1000 форків. Спрінг у своїх класах використовує ломбок. Якщо у тебе в проекті є спринг, пошукай, можливо, він підтягнув ломбок, просто ти не знаєш.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ