کتابخانه لومبوک مقدار کد نوشته شده را کاهش می دهد و خوانایی را بهبود می بخشد. نمونه استفاده یک کلاس معمولی
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، کد منبع ما کد جاوا معتبر نخواهد بود. بنابراین، شما باید یک افزونه برای IDE نصب کنید، در غیر این صورت محیط توسعه متوجه نخواهد شد که با چه چیزی سر و کار دارد. Lombok از تمام IDE های اصلی جاوا پشتیبانی می کند. ادغام یکپارچه است. همه توابع مانند "نمایش استفاده" و "برو به پیاده سازی" مانند قبل به کار خود ادامه می دهند و شما را به فیلد/کلاس مناسب می برند. بنابراین، برای کلاس های ساده می توانید از حاشیه نویسی استفاده کنید @Data
. @Data
- سازنده، گیرنده، تنظیم کننده، متد equals
،، hashCode
. toString
برای غیرقابل تغییر کردن اجسام وجود دارد @Value
. @Value
- سازنده را تولید می کند، فقط دریافت کننده ها، متدها 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
- روش هایی را تولید می کند که با آن یک شی را در طول یک زنجیره مقداردهی اولیه می کنیم. این زمانی راحت است که ما نمی خواهیم از سازنده ای با همه پارامترها استفاده کنیم (اگر کلاس ما تغییرناپذیر است، پس یک سازنده با تمام پارامترها دارد).
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
- Exclude a field in a method toString
@EqualsAndHashCode.Exclude
- Exclude a field in a method equals
andhashCode
@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
<h2>نتیجه گیری</h2>اینها فقط حاشیه نویسی های اولیه لومبوک هستند، اما بیشترین استفاده را دارند و بیشترین تأثیر را دارند. شما نیز نباید زیاد از تولید کد غافل شوید. <h2>پیوندها</h2>
GO TO FULL VERSION