Встречается на 2% собеседований по Java

Как реализуешь Lazy инициализацию

Lazy инициализация откладывает создание объекта до первого обращения. В Java есть несколько способов:

  1. С помощью проверки на null (не потокобезопасно):
java
private ExpensiveObject instance;
public ExpensiveObject getInstance() {
    if (instance == null) {
        instance = new ExpensiveObject();
    }
    return instance;
}
  1. Синхронизированный метод (потокобезопасно, но медленно):
java
private ExpensiveObject instance;
public synchronized ExpensiveObject getInstance() {
    if (instance == null) {
        instance = new ExpensiveObject();
    }
    return instance;
}
  1. Double-Checked Locking (оптимально для многопоточности):
java
private volatile ExpensiveObject instance;
public ExpensiveObject getInstance() {
    if (instance == null) {
        synchronized (this) {
            if (instance == null) {
                instance = new ExpensiveObject();
            }
        }
    }
    return instance;
}
  1. Используя класс Holder (лучший вариант для Singleton):
java
private static class Holder {
    static final ExpensiveObject INSTANCE = new ExpensiveObject();
}
public static ExpensiveObject getInstance() {
    return Holder.INSTANCE;
}

Для коллекций можно использовать Supplier из Java 8:

java
Supplier<List<String>> lazyList = () -> {
    List<String> list = new ArrayList<>();
    // инициализация
    return list;
};
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы