java — идиома инициализации по требованию

Эта реализация чаще всего встречается в Интернете.

private static class LazySomethingHolder {
public static Something something = new Something();
}

public static Something getInstance() {
return LazySomethingHolder.something;
}

Верна ли следующая более простая вариация, если нет, что с ней не так? Эта проблема характерна для Java или также присутствует в C ++?

public static Something getInstance() {
private static Something something = new Something();
return something;
}

0

Решение

Вы не можете иметь статические локальные переменные в Java.

Более простые альтернативы

private static final Something something = new Something();

public static Something getInstance() {
return something;
}

или мое предпочтение, если для.

enum Something {
INSTANCE;
}

Единственная проблема с этими шаблонами состоит в том, что если у вас есть несколько экземпляров, которые вы хотите загружать лениво, у вас должен быть класс каждый, или загрузка одного будет означать загрузку их всех.

1

Другие решения

Java (в отличие от c ++) не имеет локальных статических переменных, поэтому описанное вами просто невозможно. В c ++ вы, скорее всего, написали бы (известный как meyer singleton):

public static Something& getInstance() {
static Something something{};
return something;
}
1

По вопросам рекламы [email protected]