JavaRush /Java Blog /Random-TW /龍目島圖書館
Сергей
等級 40
Москва

龍目島圖書館

在 Random-TW 群組發布
Lombok 函式庫減少了編寫的程式碼量,提高了可讀性。 龍目島圖書館 - 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;
}
我們刪除了一堆程式碼,但是所有方法和修飾符仍然保留。怎麼運作的。Lombok 在編譯時產生程式碼。lombok 庫本身在運行時遺失。它的使用不會增加程式的大小。當使用 Lombok 時,我們的原始程式碼將不是有效的 Java 程式碼。因此,您需要為IDE安裝一個插件,否則開發環境將無法理解它在處理什麼。Lombok 支援所有主要的 Java IDE。集成是無縫的。所有功能(例如“顯示用法”和“轉到實現”)都將繼續像以前一樣工作,將您帶到適當的欄位/類別。因此,對於簡單的類,您可以使用註解@Data。 - 產生建構子、 getter @Data、setter、方法equals、、hashCodetoString要使物件不可變,有@Value. @Value- 產生建構函數,只產生 getter、方法equalshashCodetoString。並且也執行所有欄位privatefinal.
@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- 產生我們沿著鏈初始化物件的方法。當我們不想使用帶有所有參數的建構函式時,這很方便(如果我們的類別是不可變的,那麼它有一個帶有所有參數的建構子)。
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- 排除方法中的字段equalshashCode
@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>這些只是基本的lombok註解,但是它們是最常用的,作用也是最大的。您也不應該對程式碼生成過於著迷。<h2>連結</h2>
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION