Lombok kutubxonasi yozilgan kod miqdorini kamaytiradi va o'qishni yaxshilaydi. Foydalanish misoli. Uchta maydonga ega oddiy sinf
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 +
'}';
}
}
Lombok bilan ham xuddi shunday
@Data
public class Person {
private String name;
private int age;
private Cat cat;
}
Biz bir qator kodlarni olib tashladik, ammo barcha usullar va modifikatorlar qoldi. U qanday ishlaydi. Lombok kompilyatsiya vaqtida kod ishlab chiqaradi. Lombok kutubxonasining o'zi ish vaqtida etishmayapti. Uning ishlatilishi dastur hajmini oshirmaydi. Lombok-dan foydalanganda bizning manba kodimiz Java kodi bo'lmaydi. Shuning uchun, siz IDE uchun plaginni o'rnatishingiz kerak bo'ladi, aks holda rivojlanish muhiti nima bilan shug'ullanayotganini tushunmaydi. Lombok barcha asosiy Java IDE-larni qo'llab-quvvatlaydi. Integratsiya muammosiz. "Foydalanishni ko'rsatish" va "amalga oshirishga o'tish" kabi barcha funktsiyalar sizni tegishli maydon/sinfga olib borib, avvalgidek ishlashda davom etadi. Shunday qilib, oddiy sinflar uchun siz izohdan foydalanishingiz mumkin @Data
. @Data
- konstruktor, oluvchi, sozlagich, usullar equals
, hashCode
, ni hosil qiladi toString
. Ob'ektlarni o'zgarmas qilish uchun mavjud @Value
. @Value
- konstruktorni hosil qiladi, faqat oluvchilar, usullar equals
, hashCode
, toString
. Va shuningdek, barcha maydonlarni bajaradi private
va final
.
@Value
public class Cat {
String name;
int age;
Person person;
}
@With
Izohlar va .o'zgarmas sinflar bilan yaxshi ishlaydi @Builder
.
@With
@Builder
@Value
public class Cat {
String name;
int age;
Person person;
}
Agar biz o'zgarmas ob'ektning maydonini o'zgartirmoqchi bo'lsak, unda bitta o'zgartirilgan parametr bilan ushbu ob'ektning klonini qilishimiz kerak. @With
- har bir maydon uchun bitta o'zgartirilgan maydon bilan ob'ektni klon qiladigan usullarni qo'shadi.
Cat anotherCat = cat.withName("Vasya");
anotherCat
- maydon qiymatlari bilan bir xil bo'lgan yangi ob'ekt cat
, maydon bundan mustasno name
. @Builder
- zanjir bo'ylab ob'ektni ishga tushirish usullarini yaratadi. Bu barcha parametrlarga ega konstruktordan foydalanishni istamaganimizda qulaydir (agar bizning sinfimiz o'zgarmas bo'lsa, unda barcha parametrlarga ega bitta konstruktor mavjud).
Cat cat = Cat.builder()
.name("Мурка")
.age(3)
.person(person)
.build();
Usullarning tsiklik chaqiruvi Agar ob'ektlar ikki tomonlama aloqaga ega bo'lsa, ya'ni. bir-biriga havolalar, keyin usullardan foydalanish xatolikka olib toString
keladi . Chunki o'rnatilgan ob'ektlar usullariga tsiklik chaqiruv bo'ladi. Ushbu kod xatolikka olib keladi: 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);
}
}
Muammoni hal qilish usulidan maydonni olib tashlash orqali tsiklik chaqiruvni buzishdir. @ToString.Exclude
- Usuldagi maydonni istisno qilish toString
@EqualsAndHashCode.Exclude
- Usuldagi maydonni istisno qilish equals
vahashCode
@Value
@With
@Builder
public class Cat {
String name;
int age;
@ToString.Exclude
@EqualsAndHashCode.Exclude
Person person;
}
Yana bir nechta foydali izohlar @Slf4j
- sinfga logger qo'shadi @SneakyThrows
- belgilangan istisnolarni bekor qiladi
@Slf4j
public class Main {
@SneakyThrows
public static void main(String[] args) {
log.info("start");
Files.readAllBytes(Paths.get(""));
}
}
Agar biron sababga ko'ra sizga faqat ma'lum usullar kerak bo'lsa, alohida izoh bering
@NoArgsConstructor //добавляет конструктор без аргументов
@AllArgsConstructor //добавляет конструктор со всеми параметрами
@RequiredArgsConstructor //добавляет конструктор для final полей
@Getter //добавляет геттеры для всех параметров класса
@Setter //добавляет сеттеры для всех параметров класса
@EqualsAndHashCode //добавляет реализации методов equals и hashCode
@ToString //добавляет реализацию метода toString
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) //делает все поля private и final
<h2>Xulosa</h2>Bu faqat asosiy lombok izohlari, lekin ular eng ko'p qo'llaniladi va eng katta ta'sirga ega. Siz ham kod ishlab chiqarish bilan shug'ullanmasligingiz kerak. <h2>Havolalar</h2>
GO TO FULL VERSION