2016-02-22 6 views
0

Это реализация в основном рассматривается в Интернетеинициализация по требованию владельца идиома

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; 
} 

ответ

1

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

Упрощенные альтернативы

private static final Something something = new Something(); 

public static Something getInstance() { 
    return something; 
} 

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

enum Something { 
    INSTANCE; 
} 

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

+1

«У вас могут быть статические поля внутри метода на Java». есть опечатка здесь – q126y

1

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

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

'something {}' что это делает? Я видел это в первый раз. – q126y

+1

@ q126y: Он по умолчанию инициализирует 'something'. Если что-то есть класс, вы также можете его опустить. – MikeMB

+1

@ q126y: Это часть C++ с C++ 11 и называется равномерным синтаксисом инициализации. – MikeMB

Смежные вопросы