Аннотации Lombok для работы с ресурсами, делегированием и утилитарными классами
Аннотация @Cleanup
Аннотация @Cleanup автоматически закрывает ресурсы, такие как потоки, сокеты или соединения с базой данных, после их использования. Это избавляет от необходимости вручную вызывать метод close().
Пример использования:
Как это работает под капотом:
Lombok оборачивает использование ресурса в блок try-finally и вызывает метод close() в блоке finally.
Сгенерированный код:
Нюансы использования:
Ресурс должен реализовывать интерфейс java.io.Closeable или java.lang.AutoCloseable.
Если метод close() выбрасывает исключение, оно будет подавлено (если не указано иное).
Аннотация @Delegate
Аннотация @Delegate позволяет делегировать вызовы методов другому объекту. Это полезно для реализации паттерна "делегирование" вместо наследования.
Пример использования:
Как это работает под капотом:
Lombok генерирует методы, которые делегируют вызовы к указанному объекту.
Сгенерированный код:
Нюансы использования:
Можно делегировать только методы интерфейсов или конкретных классов.
Если класс реализует несколько интерфейсов, можно указать, какие из них делегировать:
Аннотация @UtilityClass
Аннотация @UtilityClass создает утилитарный класс, в котором все методы и поля становятся статическими, а конструктор — приватным.
Пример использования:
Как это работает под капотом:
Lombok делает класс финальным, генерирует приватный конструктор и делает все методы и поля статическими.
Сгенерированный код:
Нюансы использования:
Класс становится финальным, и его нельзя наследовать.
Конструктор приватный, что предотвращает создание экземпляров класса.
Аннотация @FieldDefaults
Аннотация @FieldDefaults управляет модификаторами доступа полей, например, автоматически добавляет final или private.
Пример использования:
Как это работает под капотом:
Lombok добавляет указанные модификаторы доступа ко всем полям класса.
Сгенерированный код:
Нюансы использования:
Можно указать уровень доступа (PRIVATE, PUBLIC, PROTECTED) и добавить final к полям.
Если поле уже имеет модификатор доступа, он не будет изменен.
#Java #Training #Spring #Lombok #Cleanup #Delegate #UtilityClass #FieldDefaults
Аннотация @Cleanup
Аннотация @Cleanup автоматически закрывает ресурсы, такие как потоки, сокеты или соединения с базой данных, после их использования. Это избавляет от необходимости вручную вызывать метод close().
Пример использования:
import lombok.Cleanup;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileService {
public void readFile(String path) throws IOException {
@Cleanup InputStream inputStream = new FileInputStream(path);
// Использование inputStream
}
}
Как это работает под капотом:
Lombok оборачивает использование ресурса в блок try-finally и вызывает метод close() в блоке finally.
Сгенерированный код:
public void readFile(String path) throws IOException {
InputStream inputStream = new FileInputStream(path);
try {
// Использование inputStream
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
Нюансы использования:
Ресурс должен реализовывать интерфейс java.io.Closeable или java.lang.AutoCloseable.
Если метод close() выбрасывает исключение, оно будет подавлено (если не указано иное).
Аннотация @Delegate
Аннотация @Delegate позволяет делегировать вызовы методов другому объекту. Это полезно для реализации паттерна "делегирование" вместо наследования.
Пример использования:
import lombok.experimental.Delegate;
public class UserService {
@Delegate
private final UserRepository userRepository = new UserRepository();
// Дополнительные методы
}
Как это работает под капотом:
Lombok генерирует методы, которые делегируют вызовы к указанному объекту.
Сгенерированный код:
public class UserService {
private final UserRepository userRepository = new UserRepository();
public void save(User user) {
userRepository.save(user);
}
public User findById(Long id) {
return userRepository.findById(id);
}
}
Нюансы использования:
Можно делегировать только методы интерфейсов или конкретных классов.
Если класс реализует несколько интерфейсов, можно указать, какие из них делегировать:
@Delegate(types = {UserRepository.class, AnotherInterface.class})
Аннотация @UtilityClass
Аннотация @UtilityClass создает утилитарный класс, в котором все методы и поля становятся статическими, а конструктор — приватным.
Пример использования:
import lombok.experimental.UtilityClass;
@UtilityClass
public class StringUtils {
public boolean isEmpty(String str) {
return str == null || str.isEmpty();
}
}
Как это работает под капотом:
Lombok делает класс финальным, генерирует приватный конструктор и делает все методы и поля статическими.
Сгенерированный код:
public final class StringUtils {
private StringUtils() {
throw new UnsupportedOperationException("Utility class");
}
public static boolean isEmpty(String str) {
return str == null || str.isEmpty();
}
}
Нюансы использования:
Класс становится финальным, и его нельзя наследовать.
Конструктор приватный, что предотвращает создание экземпляров класса.
Аннотация @FieldDefaults
Аннотация @FieldDefaults управляет модификаторами доступа полей, например, автоматически добавляет final или private.
Пример использования:
import lombok.experimental.FieldDefaults;
import lombok.AccessLevel;
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class User {
String name;
int age;
}
Как это работает под капотом:
Lombok добавляет указанные модификаторы доступа ко всем полям класса.
Сгенерированный код:
public class User {
private final String name;
private final int age;
}
Нюансы использования:
Можно указать уровень доступа (PRIVATE, PUBLIC, PROTECTED) и добавить final к полям.
Если поле уже имеет модификатор доступа, он не будет изменен.
#Java #Training #Spring #Lombok #Cleanup #Delegate #UtilityClass #FieldDefaults