Встречается на 2% собеседований по Java
Как реализуешь Lazy инициализацию
Lazy инициализация откладывает создание объекта до первого обращения. В Java есть несколько способов:
- С помощью проверки на null (не потокобезопасно):
java
private ExpensiveObject instance;
public ExpensiveObject getInstance() {
if (instance == null) {
instance = new ExpensiveObject();
}
return instance;
}- Синхронизированный метод (потокобезопасно, но медленно):
java
private ExpensiveObject instance;
public synchronized ExpensiveObject getInstance() {
if (instance == null) {
instance = new ExpensiveObject();
}
return instance;
}- Double-Checked Locking (оптимально для многопоточности):
java
private volatile ExpensiveObject instance;
public ExpensiveObject getInstance() {
if (instance == null) {
synchronized (this) {
if (instance == null) {
instance = new ExpensiveObject();
}
}
}
return instance;
}- Используя класс 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;
};
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
офферы быстрее!
Попробовать бесплатно
Следующий вопрос
Это единственный вопрос по вашему фильтру
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы