Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.
Наука · 20 июля 2026 г.
🧠 Lazy Initialization по-взрослому: не создавай проблемы на ровном месте — 20 июля 2026 г. в 05:33:58.620
🧠 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

