JavaRush /Java blogi /Random-UZ /Lombok kutubxonasi
Сергей
Daraja
Москва

Lombok kutubxonasi

Guruhda nashr etilgan
Lombok kutubxonasi yozilgan kod miqdorini kamaytiradi va o'qishni yaxshilaydi. Lombok kutubxonasi - 1Foydalanish misoli. Uchta maydonga ega oddiy sinf 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 bilan ham xuddi shunday
@Data
public class Person {
    private String name;
    private int age;
    private Cat cat;
}
Biz bir qator kodlarni olib tashladik, ammo barcha usullar va modifikatorlar qoldi. U qanday ishlaydi. Lombok kompilyatsiya vaqtida kod ishlab chiqaradi. Lombok kutubxonasining o'zi ish vaqtida etishmayapti. Uning ishlatilishi dastur hajmini oshirmaydi. Lombok-dan foydalanganda bizning manba kodimiz Java kodi bo'lmaydi. Shuning uchun, siz IDE uchun plaginni o'rnatishingiz kerak bo'ladi, aks holda rivojlanish muhiti nima bilan shug'ullanayotganini tushunmaydi. Lombok barcha asosiy Java IDE-larni qo'llab-quvvatlaydi. Integratsiya muammosiz. "Foydalanishni ko'rsatish" va "amalga oshirishga o'tish" kabi barcha funktsiyalar sizni tegishli maydon/sinfga olib borib, avvalgidek ishlashda davom etadi. Shunday qilib, oddiy sinflar uchun siz izohdan foydalanishingiz mumkin @Data. @Data- konstruktor, oluvchi, sozlagich, usullar equals, hashCode, ni hosil qiladi toString. Ob'ektlarni o'zgarmas qilish uchun mavjud @Value. @Value- konstruktorni hosil qiladi, faqat oluvchilar, usullar equals, hashCode, toString. Va shuningdek, barcha maydonlarni bajaradi privateva final.
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
@WithIzohlar va .o'zgarmas sinflar bilan yaxshi ishlaydi @Builder.
@With
@Builder
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
Agar biz o'zgarmas ob'ektning maydonini o'zgartirmoqchi bo'lsak, unda bitta o'zgartirilgan parametr bilan ushbu ob'ektning klonini qilishimiz kerak. @With- har bir maydon uchun bitta o'zgartirilgan maydon bilan ob'ektni klon qiladigan usullarni qo'shadi.
Cat anotherCat = cat.withName("Vasya");
anotherCat- maydon qiymatlari bilan bir xil bo'lgan yangi ob'ekt cat, maydon bundan mustasno name. @Builder- zanjir bo'ylab ob'ektni ishga tushirish usullarini yaratadi. Bu barcha parametrlarga ega konstruktordan foydalanishni istamaganimizda qulaydir (agar bizning sinfimiz o'zgarmas bo'lsa, unda barcha parametrlarga ega bitta konstruktor mavjud).
Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();
Usullarning tsiklik chaqiruvi Agar ob'ektlar ikki tomonlama aloqaga ega bo'lsa, ya'ni. bir-biriga havolalar, keyin usullardan foydalanish xatolikka olib toStringkeladi . Chunki o'rnatilgan ob'ektlar usullariga tsiklik chaqiruv bo'ladi. Ushbu kod xatolikka olib keladi: equalshashCodeStackOverflowError
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("Ivan");
        person.setAge(26);
        person.setCat(cat);

        System.out.println(person);
        System.out.println(cat);
    }
}
Muammoni hal qilish usulidan maydonni olib tashlash orqali tsiklik chaqiruvni buzishdir. @ToString.Exclude- Usuldagi maydonni istisno qilish toString @EqualsAndHashCode.Exclude- Usuldagi maydonni istisno qilish equalsvahashCode
@Value
@With
@Builder
public class Cat {
    String name;
    int age;
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    Person person;
}
Yana bir nechta foydali izohlar @Slf4j- sinfga logger qo'shadi @SneakyThrows- belgilangan istisnolarni bekor qiladi
@Slf4j
public class Main {

    @SneakyThrows
    public static void main(String[] args) {
        log.info("start");
        Files.readAllBytes(Paths.get(""));
    }
}
Agar biron sababga ko'ra sizga faqat ma'lum usullar kerak bo'lsa, alohida izoh bering
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
Lombok kutubxonasi - 2<h2>Xulosa</h2>Bu faqat asosiy lombok izohlari, lekin ular eng ko'p qo'llaniladi va eng katta ta'sirga ega. Siz ham kod ishlab chiqarish bilan shug'ullanmasligingiz kerak. <h2>Havolalar</h2>
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION