تعمل مكتبة لومبوك على تقليل كمية التعليمات البرمجية المكتوبة، مما يحسن إمكانية القراءة. مثال للاستخدام. فئة عادية
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 الأساسية. التكامل سلس. تستمر جميع الوظائف مثل "إظهار الاستخدام" و"الانتقال إلى التنفيذ" في العمل كما كانت من قبل، وتنقلك إلى الحقل/الفئة المناسبة. لذلك، بالنسبة للفصول البسيطة، يمكنك استخدام التعليق التوضيحي @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
- استبعاد حقل في الطريقة toString
@EqualsAndHashCode.Exclude
- استبعاد حقل في الطريقة equals
وhashCode
@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