Бібліотека Lombok скорочує кількість написаного коду, покращуючи читання. Приклад використання. Звичайний клас
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
@Data
public class Person {
String name;
int age;
Cat cat;
}
Ми прибрали купу коду, проте всі методи і модифікатори залишабося. Як це працює. Lombok генерує код на етапі компіляції. Сама бібліотека lombok відсутня у рантаймі. Її використання не збільшує розмір програми. При використанні Lombok, наш вихідний код не буде валідним кодом Java. Тому потрібно встановити плагін для IDE, інакше середовище розробки не зрозуміє, з чим має справу. Lombok підтримує всі основні Java IDE. Безшовна інтеграція. Усі функції на кшталт «показати використання» та «перейти до реалізації» продовжують працювати як і раніше, переміщуючи вас до відповідного поля/класу. Отже, для простих класів можна скористатися інструкцією @Data
. @Data
- генерує конструктор, геттери, сеттери, методи equals
, hashCode
, toString
. А також робить усі поляprivate
. Щоб зробити об'єкти незмінними є @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("Вася");
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("Іван");
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
- додає в клас логгер log @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>Це лише основні анотації lombok, але вони найчастіше використовуються і дають максимальний ефект. Надто сильно захоплюватися генерацією коду теж не варто. <h2>Посилання</h2>