Perpustakaan Lombok mengurangkan jumlah kod yang ditulis, meningkatkan kebolehbacaan. Contoh penggunaan. Kelas biasa
Person
dengan tiga bidang:
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 +
'}';
}
}
Perkara yang sama dengan lombok
@Data
public class Person {
private String name;
private int age;
private Cat cat;
}
Kami mengalih keluar sekumpulan kod, bagaimanapun, semua kaedah dan pengubah suai kekal. Bagaimana ia berfungsi. Lombok menjana kod pada masa penyusunan. Perpustakaan lombok itu sendiri tiada dalam masa tayangan. Penggunaannya tidak meningkatkan saiz program. Apabila menggunakan Lombok, kod sumber kami tidak akan menjadi kod Java yang sah. Oleh itu, anda perlu memasang pemalam untuk IDE, jika tidak, persekitaran pembangunan tidak akan memahami perkara yang dihadapinya. Lombok menyokong semua IDE Java utama. Penyepaduan adalah lancar. Semua fungsi seperti "tunjukkan penggunaan" dan "pergi ke pelaksanaan" terus berfungsi seperti sebelumnya, membawa anda ke medan/kelas yang sesuai. Jadi, untuk kelas mudah anda boleh menggunakan anotasi @Data
. @Data
- menjana pembina, getter, setter, kaedah equals
, hashCode
, toString
. Untuk menjadikan objek tidak berubah terdapat @Value
. @Value
- menjana pembina, hanya getter, kaedah equals
, hashCode
, toString
. Dan juga melakukan semua bidang private
dan final
.
@Value
public class Cat {
String name;
int age;
Person person;
}
@With
Anotasi dan .berfungsi dengan baik dengan kelas tidak berubah @Builder
.
@With
@Builder
@Value
public class Cat {
String name;
int age;
Person person;
}
Jika kita ingin menukar medan objek tidak berubah, maka kita perlu membuat klon objek ini dengan satu parameter yang diubah. @With
- menambah kaedah untuk setiap medan yang membuat klon objek dengan satu medan yang diubah.
Cat anotherCat = cat.withName("Vasya");
anotherCat
- objek baharu yang nilai medannya sama dengan cat
, kecuali medan name
. @Builder
- menjana kaedah dengan mana kita memulakan objek di sepanjang rantai. Ini mudah apabila kita tidak mahu menggunakan pembina dengan semua parameter (Jika kelas kita tidak berubah, maka ia mempunyai satu pembina dengan semua parameter).
Cat cat = Cat.builder()
.name("Мурка")
.age(3)
.person(person)
.build();
Panggilan kaedah kitaran Jika objek mempunyai komunikasi dua arah, i.e. rujukan antara satu sama lain, kemudian menggunakan kaedah toString
akan equals
membawa hashCode
kepada ralat StackOverflowError
. Kerana akan ada panggilan kitaran kepada kaedah objek bersarang. Kod ini akan mengakibatkan ralat:
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);
}
}
Penyelesaian kepada masalah ini adalah untuk memecahkan panggilan kitaran dengan mengalih keluar medan daripada kaedah. @ToString.Exclude
- Kecualikan medan dalam kaedah toString
@EqualsAndHashCode.Exclude
- Kecualikan medan dalam kaedah equals
danhashCode
@Value
@With
@Builder
public class Cat {
String name;
int age;
@ToString.Exclude
@EqualsAndHashCode.Exclude
Person person;
}
Beberapa anotasi yang lebih berguna @Slf4j
- menambahkan pembalak pada kelas @SneakyThrows
- membuat pengecualian yang diperiksa tidak ditandakan
@Slf4j
public class Main {
@SneakyThrows
public static void main(String[] args) {
log.info("start");
Files.readAllBytes(Paths.get(""));
}
}
Anotasi secara individu Jika atas sebab tertentu anda hanya memerlukan kaedah tertentu
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
<h2>Kesimpulan</h2>Ini hanyalah anotasi asas lombok, tetapi ia adalah yang paling biasa digunakan dan mempunyai kesan yang paling besar. Anda juga tidak seharusnya terlalu terbawa-bawa dengan penjanaan kod. <h2>Pautan</h2>
GO TO FULL VERSION