Продвинутые аннотации Lombok и лучшие практики
Аннотация @ExtensionMethod
Аннотация @ExtensionMethod позволяет добавлять методы-расширения к существующим классам. Это похоже на extension-методы в Kotlin или C#.
Пример использования:
Как это работает под капотом:
Lombok преобразует вызовы методов-расширений в вызовы статических методов.
Сгенерированный код:
Нюансы использования:
Методы-расширения должны быть статическими.
Аннотация находится в экспериментальном статусе и может измениться в будущем.
Аннотация @Accessors
Аннотация @Accessors настраивает поведение геттеров и сеттеров, например, позволяет создавать цепочные сеттеры.
Пример использования:
Как это работает под капотом:
Lombok генерирует сеттеры, которые возвращают this, что позволяет использовать цепочки вызовов.
Сгенерированный код:
Нюансы использования:
Можно настроить префиксы для геттеров и сеттеров:
Аннотация @Wither
Аннотация @Wither создает методы для создания копии объекта с измененным значением одного поля. Это аналог @With, но находится в экспериментальном статусе.
Пример использования:
Как это работает под капотом:
Lombok генерирует методы withFieldName() для каждого поля.
Сгенерированный код:
Нюансы использования:
Работает только с final-полями.
Находится в экспериментальном статусе.
Аннотация @Helper
Аннотация @Helper создает локальные вспомогательные классы внутри методов.
Пример использования:
Как это работает под капотом:
Lombok создает локальный класс, который можно использовать внутри метода.
Сгенерированный код:
Нюансы использования:
Находится в экспериментальном статусе.
Полезно для организации кода внутри методов.
#Java #Training #Spring #Lombok #ExtensionMethod #Accessors #Wither #Helper
Аннотация @ExtensionMethod
Аннотация @ExtensionMethod позволяет добавлять методы-расширения к существующим классам. Это похоже на extension-методы в Kotlin или C#.
Пример использования:
import lombok.experimental.ExtensionMethod;
import java.util.Collections;
@ExtensionMethod(Collections.class)
public class ListUtils {
public void example() {
java.util.List<String> list = new java.util.ArrayList<>();
list.add("Hello");
list = unmodifiableList(list); // Метод из Collections
}
}
Как это работает под капотом:
Lombok преобразует вызовы методов-расширений в вызовы статических методов.
Сгенерированный код:
public class ListUtils {
    public void example() {
        java.util.List<String> list = new java.util.ArrayList<>();
        list.add("Hello");
        list = Collections.unmodifiableList(list);
    }
}Нюансы использования:
Методы-расширения должны быть статическими.
Аннотация находится в экспериментальном статусе и может измениться в будущем.
Аннотация @Accessors
Аннотация @Accessors настраивает поведение геттеров и сеттеров, например, позволяет создавать цепочные сеттеры.
Пример использования:
import lombok.experimental.Accessors;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Accessors(chain = true)
public class User {
private String name;
private int age;
}
// Использование:
User user = new User().setName("John").setAge(30);
Как это работает под капотом:
Lombok генерирует сеттеры, которые возвращают this, что позволяет использовать цепочки вызовов.
Сгенерированный код:
public class User {
    private String name;
    private int age;
    public User setName(String name) {
        this.name = name;
        return this;
    }
    public User setAge(int age) {
        this.age = age;
        return this;
    }
}Нюансы использования:
Можно настроить префиксы для геттеров и сеттеров:
@Accessors(prefix = "m_")
private String m_name;
Аннотация @Wither
Аннотация @Wither создает методы для создания копии объекта с измененным значением одного поля. Это аналог @With, но находится в экспериментальном статусе.
Пример использования:
import lombok.experimental.Wither;
@Wither
public class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
// Использование:
User user = new User("John", 30);
User newUser = user.withAge(31);
Как это работает под капотом:
Lombok генерирует методы withFieldName() для каждого поля.
Сгенерированный код:
public class User {
    private final String name;
    private final int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public User withName(String name) {
        return this.name == name ? this : new User(name, this.age);
    }
    public User withAge(int age) {
        return this.age == age ? this : new User(this.name, age);
    }
}Нюансы использования:
Работает только с final-полями.
Находится в экспериментальном статусе.
Аннотация @Helper
Аннотация @Helper создает локальные вспомогательные классы внутри методов.
Пример использования:
import lombok.experimental.Helper;
public class Example {
public void exampleMethod() {
@Helper
class LocalHelper {
void help() {
System.out.println("Helping!");
}
}
new LocalHelper().help();
}
}
Как это работает под капотом:
Lombok создает локальный класс, который можно использовать внутри метода.
Сгенерированный код:
public class Example {
    public void exampleMethod() {
        class LocalHelper {
            void help() {
                System.out.println("Helping!");
            }
        }
        new LocalHelper().help();
    }
}Нюансы использования:
Находится в экспериментальном статусе.
Полезно для организации кода внутри методов.
#Java #Training #Spring #Lombok #ExtensionMethod #Accessors #Wither #Helper
👍1