JavaRush /Blog Java /Random-VI /Thư viện Lombok
Сергей
Mức độ
Москва

Thư viện Lombok

Xuất bản trong nhóm
Thư viện Lombok giảm số lượng mã được viết, cải thiện khả năng đọc. Thư viện Lombok - 1Ví dụ về việc sử dụng. Một lớp học thông thường Personcó ba trường:
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 +
                '}';
    }
}
Điều tương tự với lombok
@Data
public class Person {
    private String name;
    private int age;
    private Cat cat;
}
Chúng tôi đã loại bỏ một loạt mã, tuy nhiên, tất cả các phương thức và công cụ sửa đổi vẫn còn. Làm thế nào nó hoạt động. Lombok tạo mã tại thời điểm biên dịch. Bản thân thư viện lombok bị thiếu trong thời gian chạy. Việc sử dụng nó không làm tăng kích thước của chương trình. Khi sử dụng Lombok, mã nguồn của chúng tôi sẽ không phải là mã Java hợp lệ. Do đó, bạn sẽ cần cài đặt một plugin cho IDE, nếu không môi trường phát triển sẽ không hiểu nó đang xử lý vấn đề gì. Lombok hỗ trợ tất cả các IDE Java chính. Sự tích hợp là liền mạch. Tất cả các chức năng như "hiển thị mức sử dụng" và "chuyển sang triển khai" tiếp tục hoạt động như trước, đưa bạn đến trường/lớp thích hợp. Vì vậy, đối với các lớp đơn giản, bạn có thể sử dụng chú thích @Data. @Data- tạo hàm tạo, getters, setters, phương thức equals, hashCode, toString. Để làm cho các đối tượng trở nên bất biến, có @Value. @Value- tạo hàm tạo, chỉ getters, phương thức equals, hashCode, toString. Và cũng thực hiện tất cả các lĩnh vực privatefinal.
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
@WithChú thích và .work tốt với các lớp bất biến @Builder.
@With
@Builder
@Value
public class Cat {
    String name;
    int age;
    Person person;
}
Nếu chúng ta muốn thay đổi trường của một đối tượng bất biến, thì chúng ta cần tạo một bản sao của đối tượng này với một tham số đã thay đổi. @With- thêm các phương thức cho từng trường tạo bản sao của đối tượng với một trường đã thay đổi.
Cat anotherCat = cat.withName("Vasya");
anotherCat- một đối tượng mới có giá trị trường giống với giá trị của cat, ngoại trừ trường name. @Builder- tạo ra các phương thức mà chúng ta khởi tạo một đối tượng dọc theo chuỗi. Điều này thuận tiện khi chúng ta không muốn sử dụng một hàm tạo với tất cả các tham số (Nếu lớp của chúng ta là bất biến thì nó có một hàm tạo duy nhất với tất cả các tham số).
Cat cat = Cat.builder()
                .name("Мурка")
                .age(3)
                .person(person)
                .build();
Cuộc gọi tuần hoàn của các phương thức Nếu các đối tượng có giao tiếp hai chiều, tức là. tham chiếu lẫn nhau thì việc sử dụng các phương thức toStringsẽ equalsdẫn hashCodeđến lỗi StackOverflowError. Bởi vì sẽ có một lệnh gọi theo chu kỳ đến các phương thức của các đối tượng lồng nhau. Mã này sẽ dẫn đến một lỗi:
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);
    }
}
Giải pháp cho vấn đề này là ngắt cuộc gọi tuần hoàn bằng cách xóa trường khỏi phương thức. @ToString.Exclude- Loại trừ một trường trong một phương thức toString @EqualsAndHashCode.Exclude- Loại trừ một trường trong một phương thức equalshashCode
@Value
@With
@Builder
public class Cat {
    String name;
    int age;
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    Person person;
}
Một vài chú thích hữu ích hơn @Slf4j- thêm trình ghi nhật ký vào lớp @SneakyThrows- bỏ chọn các ngoại lệ đã kiểm tra
@Slf4j
public class Main {

    @SneakyThrows
    public static void main(String[] args) {
        log.info("start");
        Files.readAllBytes(Paths.get(""));
    }
}
Chú thích riêng lẻ Nếu vì lý do nào đó bạn chỉ cần một số phương pháp nhất định
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
Thư viện Lombok - 2<h2>Kết luận</h2>Đây chỉ là những chú thích lombok cơ bản nhưng chúng được sử dụng phổ biến nhất và có tác dụng lớn nhất. Bạn cũng không nên quá bận tâm với việc tạo mã. <h2>Liên kết</h2>
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION