JavaRush /จาวาบล็อก /Random-TH /ห้องสมุดลอมบอก
Сергей
ระดับ
Москва

ห้องสมุดลอมบอก

เผยแพร่ในกลุ่ม
ห้องสมุดลอมบอกช่วยลดจำนวนการเขียนโค้ด ปรับปรุงความสามารถในการอ่าน ห้องสมุดลอมบอก - 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;
}
เราได้ลบโค้ดจำนวนมากออกไป อย่างไรก็ตาม วิธีการและตัวแก้ไขทั้งหมดยังคงอยู่ มันทำงานอย่างไร. ลอมบอกสร้างโค้ดในเวลาคอมไพล์ ไลบรารีลอมบอกนั้นหายไปในรันไทม์ การใช้งานไม่ได้เพิ่มขนาดของโปรแกรม เมื่อใช้ลอมบอก ซอร์สโค้ดของเราจะไม่ใช่โค้ด Java ที่ถูกต้อง ดังนั้นคุณจะต้องติดตั้งปลั๊กอินสำหรับ IDE มิฉะนั้นสภาพแวดล้อมการพัฒนาจะไม่เข้าใจว่ามันเกี่ยวข้องกับอะไร ลอมบอกรองรับ Java IDE หลักๆ ทั้งหมด การบูรณาการเป็นไปอย่างราบรื่น ฟังก์ชันทั้งหมดเช่น "แสดงการใช้งาน" และ "ไปที่การใช้งาน" ยังคงทำงานเหมือนเดิม โดยนำคุณไปยังสาขา/คลาสที่เหมาะสม ดังนั้นสำหรับคลาสธรรมดาๆ คุณสามารถใช้คำอธิบายประกอบ@Dataได้ @Data- สร้าง Constructor, Getters, Setters, Method equals, hashCode, toString. เพื่อให้วัตถุไม่เปลี่ยนรูป@Valueมี @Value- สร้างคอนสตรัคเตอร์เฉพาะ getters วิธีการ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");
anotherCat- ออบเจ็กต์ใหม่ที่มีค่าฟิลด์เหมือนกับของcatยกเว้นnameฟิลด์ @Builder- สร้างวิธีการที่เราเริ่มต้นวัตถุตามสายโซ่ วิธีนี้จะสะดวกเมื่อเราไม่ต้องการใช้ Constructor กับพารามิเตอร์ทั้งหมด (หากคลาสของเราไม่เปลี่ยนรูป ก็จะมี Constructor ตัวเดียวที่มีพารามิเตอร์ทั้งหมด)
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("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;
}
คำอธิบายประกอบที่มีประโยชน์อีกสองสามรายการ @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>สิ่งเหล่านี้เป็นเพียงคำอธิบายประกอบพื้นฐานของลอมบอก แต่มีการใช้บ่อยที่สุดและมีผลกระทบมากที่สุด คุณไม่ควรหมกมุ่นอยู่กับการสร้างโค้ดมากเกินไป <h2>ลิงก์</h2>
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION