Java for Beginner
710 subscribers
618 photos
166 videos
12 files
967 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотации Lombok для работы с ресурсами, делегированием и утилитарными классами

Аннотация @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
👍1
Продвинутые аннотации Lombok и лучшие практики

Аннотация @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
Лучшие практики использования Lombok

Когда использовать
Lombok:
Для сокращения шаблонного кода (геттеры, сеттеры, конструкторы).
Для улучшения читаемости кода.


Как избежать злоупотребления:
Не используйте Lombok для сложной логики.
Избегайте чрезмерного использования аннотаций, таких как
@Data или @AllArgsConstructor.

Совместимость с другими библиотеками:

Lombok может конфликтовать с Jackson, Hibernate и другими библиотеками. Будьте осторожны с аннотациями, которые генерируют методы.

Проблемы и ограничения Lombok

Проблемы с поддержкой в IDE:
Некоторые IDE могут некорректно обрабатывать код с Lombok. Убедитесь, что плагин Lombok установлен и настроен.

Ограничения при использовании с другими инструментами:
Например, Jackson может не работать с @Data, если не настроены правильные геттеры и сеттеры.

Отладка:
Поскольку сгенерированный код не отображается в исходниках, отладка может быть сложнее. Убедитесь, что ваша IDE поддерживает Lombok.

#Java #Training #Spring #Lombok #Best_practices
👍2