JavaRush/Java блог/Random UA/Бібліотека Lombok
Сергей
40 рівень

Бібліотека Lombok

Стаття з групи Random UA
учасників
Бібліотека Lombok скорочує кількість написаного коду, покращуючи читання. Бібліотека Lombok - 1Приклад використання. Звичайний клас Personз трьома полями:
public class Person {

    private String name;
    private int age;
    private Cat cat;

    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;
    }

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name) &&
                Objects.equals(cat, person.cat);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, cat);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cat=" + cat +
                '}';
    }
}
Теж саме з lombok
@Data
public class Person {
    String name;
    int age;
    Cat cat;
}
Ми прибрали купу коду, проте всі методи і модифікатори залишабося. Як це працює. Lombok генерує код на етапі компіляції. Сама бібліотека lombok відсутня у рантаймі. Її використання не збільшує розмір програми. При використанні Lombok, наш вихідний код не буде валідним кодом Java. Тому потрібно встановити плагін для IDE, інакше середовище розробки не зрозуміє, з чим має справу. Lombok підтримує всі основні Java IDE. Безшовна інтеграція. Усі функції на кшталт «показати використання» та «перейти до реалізації» продовжують працювати як і раніше, переміщуючи вас до відповідного поля/класу. Отже, для простих класів можна скористатися інструкцією @Data. @Data- генерує конструктор, геттери, сеттери, методи equals, hashCode, toString. А також робить усі поляprivate. Щоб зробити об'єкти незмінними є @Value. @Value- генерує конструктор, тільки гетери, методи equals, hashCode, toString. А також робить всі поля privateта final.
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
З незмінними класами добре поєднуються інструкції @Withта @Builder.
@With
@Builder
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
Якщо ми хочемо у незмінного об'єкта поміняти поле, нам потрібно зробити клон цього об'єкта з одним зміненим параметром. @With- Додає методи для кожного поля, які роблять клон об'єкта з одним зміненим полем.
Cat anotherCat = cat.withName("Вася");
anotherCat- новий об'єкт у якого значення полів такі ж як cat, крім поля name. @Builder- генерує методи, якими ми ініціалізуємо об'єкт по ланцюжку. Це зручно коли ми не хочемо використовувати конструктор з усіма параметрами (Якщо у нас клас незмінний, то в ньому єдиний конструктор з усіма параметрами).
Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();
Циклічний виклик методів Якщо об'єкти мають двонаправлений зв'язок, тобто. посилання один на одного, то використання методів toStringі equalsпризведе hashCodeдо помилки StackOverflowError. Т.к. буде циклічний виклик методів вкладених об'єктів. Цей код призведе до помилки:
public class Main {

    public static void main(String[] args) {
        Person person = new Person();

        Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();

        person.setName("Іван");
        person.setAge(26);
        person.setCat(cat);

        System.out.println(person);
        System.out.println(cat);
    }
}
Вирішення проблеми - перервати циклічний виклик, прибравши з методу поле. @ToString.Exclude- Виключити поле у ​​методі toString @EqualsAndHashCode.Exclude- Виключити поле у ​​методі equalsтаhashCode
@Value
@With
@Builder
public class Cat {
    String name;
    int age;
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    Person person;
}
Ще пара корисних анотацій @Slf4j- додає в клас логгер log @SneakyThrows- робить виключення, що перевіряються, неперевіреними
@Slf4j
public class Main {

    @SneakyThrows
    public static void main(String[] args) {
        log.info("start");
        Files.readAllBytes(Paths.get(""));
    }
}
Анотації окремо Якщо з якихось причин вам потрібні лише певні методи
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
Бібліотека Lombok - 2<h2>Висновок</h2>Це лише основні анотації lombok, але вони найчастіше використовуються і дають максимальний ефект. Надто сильно захоплюватися генерацією коду теж не варто. <h2>Посилання</h2>
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.