JavaRush /Java блогы /Random-KK /Ломбок кітапханасы
Сергей
Деңгей
Москва

Ломбок кітапханасы

Топта жарияланған
Ломбок кітапханасы жазылған code көлемін азайтып, оқылуды жақсартады. Ломбок кітапханасы - 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 +
                '}';
    }
}
Ломбокпен бірдей нәрсе
@Data
public class Person {
    private String name;
    private int age;
    private Cat cat;
}
Біз бірнеше codeты алып тастадық, бірақ барлық әдістер мен модификаторлар қалды. Бұл қалай жұмыс істейді. Lombok компиляция уақытында codeты жасайды. Ломбок кітапханасының өзі жұмыс уақытында жоқ. Оны пайдалану бағдарламаның көлемін ұлғайтпайды. Lombok пайдаланған кезде біздің бастапқы code Java codeы жарамсыз болады. Сондықтан IDE үшін плагинді орнату қажет болады, әйтпесе әзірлеу ортасы оның немен айналысатынын түсінбейді. Lombok барлық негізгі Java IDE-лерін қолдайды. Интеграция үздіксіз. «Қолдануды көрсету» және «іске асыруға өту» сияқты барлық функциялар сізді тиісті өріске/сыныпқа апарып, бұрынғыдай жұмысын жалғастырады. Сонымен, қарапайым сабақтар үшін сіз annotationны пайдалана аласыз @Data. @Data- конструкторды, алушыларды, орнатушыларды, әдістерді equals, hashCode, генерациялайды toString. Объектілерді өзгермейтін ету үшін бар @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("Vasya");
anotherCatcat- өріс мәндері өрістен басқа өріс мәндерімен бірдей жаңа нысан name. @Builder- an objectіні тізбек бойынша инициализациялау әдістерін жасайды. Бұл барлық параметрлері бар конструкторды пайдаланғымыз келмегенде ыңғайлы (Егер біздің класс өзгермейтін болса, онда оның барлық параметрлері бар жалғыз конструкторы болады).
Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();
Әдістерді циклдік шақыру Егер an objectілерде екі бағытты байланыс болса, яғни. бір-біріне сілтемелер , содан кейін әдістерді пайдалану қатеге toStringәкеледі . Өйткені кірістірілген нысандар әдістеріне циклдік шақыру болады. Бұл code қатеге әкеледі: 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);
    }
}
Мәселенің шешімі - өрісті әдістен алып тастау арқылы циклдік шақыруды бұзу. @ToString.Exclude- Әдістегі өрісті шығарып тастау toString @EqualsAndHashCode.Exclude- Әдістегі өрісті шығарып тастау equalsжәнеhashCode
@Value
@With
@Builder
public class Cat {
    String name;
    int age;
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    Person person;
}
Бірнеше пайдалы annotationлар @Slf4j- сыныпқа тіркеуші қосады @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
Ломбок кітапханасы - 2<h2>Қорытынды</h2>Бұл жай ғана негізгі ломбок annotationлары, бірақ олар ең жиі қолданылатын және ең үлкен әсерге ие. Сіз codeты генерациялаумен де айналыспауыңыз керек. <h2>Сілтемелер</h2>
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION