JavaRush /Java блогу /Random-KY /Ломбок китепканасы
Сергей
Деңгээл
Москва

Ломбок китепканасы

Группада жарыяланган
Ломбок китепканасы жазылган 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;
}
Эгерде биз өзгөрүлгүс an objectтин талаасын өзгөртүүнү кааласак, анда биз бул an objectтин бир өзгөргөн параметри менен клондорун жасашыбыз керек. @With- бир өзгөртүлгөн талаа менен an objectтин клонун түзгөн ар бир талаа үчүн ыкмаларды кошот.
Cat anotherCat = cat.withName("Vasya");
anotherCatcat- талаадан тышкары, талаа маанилери менен бирдей болгон жаңы an object name. @Builder- an objectти чынжыр боюнча инициализациялоочу методдорду жаратат. Бул бардык параметрлери бар конструкторду колдонгубуз келбеген учурда ыңгайлуу (эгерде биздин класс өзгөрбөс болсо, анда анын бардык параметрлери бар бир конструктор бар).
Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();
Методдорду циклдик чакыруу Эгерде an objectтер эки багыттуу байланышка ээ болсо, б.а. бири-бирине шилтемелер, анда ыкмаларды колдонуу катага алып toStringкелет . Анткени уяланган an objectтердин ыкмаларына циклдик чакыруу болот. Бул 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