🧠 Lazy Initialization по-взрослому: не создавай проблемы на ровном месте



В Spring Boot часто можно встретить вот такую конструкцию:

@Service
public class EmailService {
private final SmtpClient client = new SmtpClient(); // дорогая инициализация
}


⚠️ Проблема: SmtpClient создаётся сразу при старте приложения. Даже если EmailService ни разу не вызовется. Это не только waste of resources, но и может сломать запуск, если SmtpClient требует специфического окружения.

📌 Решение — ленивая инициализация, но не через старый добрый null-check, а красиво, безопасно и читаемо:

💡 Способ #1: Lazy<T> wrapper

@Component
public class EmailService {
private final Supplier<SmtpClient> client = Suppliers.memoize(SmtpClient::new);

public void sendEmail(...) {
client.get().send(...);
}
}

Можно и без Guava:

public class Lazy<T> {
private Supplier<T> supplier;

public Lazy(Supplier<T> supplier) {
this.supplier = () -> {
T value = supplier.get();
this.supplier = () -> value;
return value;
};
}

public T get() {
return supplier.get();
}
}

💡 Способ #2: через Spring

@Service
public class EmailService {
private final ObjectProvider<SmtpClient> client;

public EmailService(ObjectProvider<SmtpClient> client) {
this.client = client;
}

public void sendEmail(...) {
client.getObject().send(...);
}
}


🧵 Итог:
- Не инициализируй тяжёлые объекты зря.
- Используй Supplier, ObjectProvider или Lazy<T>.
- Это особенно критично для тестов, лямбд и кэширования.

👉 @BookJava
Просмотры: 594
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти