5

W przykładzie article na podwójnie sprawdzone idiom blokowania, znalazłem ten cytat:leniwe inicjowanie za darmo

Jeden szczególny przypadek leniwej inicjalizacji, że działa zgodnie z oczekiwaniami bez synchronizacji jest statyczna Singleton. Gdy zainicjalizowany obiekt jest statycznym polem klasy bez żadnych innych metod ani pól, JVM skutecznie wykonuje leniwą inicjalizację automatycznie.

Dlaczego podkreślona część jest ważna? Dlaczego to nie działa, jeśli istnieją inne metody lub pola?

(Artykuł jest już ponad 10 lat. Czy informacja jest nadal aktualna?)

+0

+1 interesujące pytanie. Początkowo domyślam się, że jest to jedyny moment, w którym JVM może być pewna, że ​​nie będzie wywołania tego obiektu, zanim zostanie przywołany poza klasą; ale to nie wydaje się niczego oświetlać. –

Odpowiedz

4

Co to oznacza to prawdopodobnie, że jeśli klasa ma inne metody lub pola, to tylko do niego dostęp dla singleton, więc singleton jest tworzony tylko wtedy, gdy jest wymagany. W przeciwnym razie, na przykład

class Foo 
{ 
    public static final Foo foo = new Foo(); 

    public static int x() { return 0; } 
} 

class AnotherClass 
{ 
    void test() 
    { 
     print(Foo.x()); 
    } 
} 

tu foo została instancja, choć nigdy nie został poproszony o.

Ale dobrze jest mieć prywatne statyczne metody/pola, więc inne nie wywołają inicjalizacji klasy przez przypadek.

+0

* "statyczne pole klasy bez żadnych innych metod lub pól" * - ale w twoim przykładzie Foo ** ma ** metodę x() – mantrid

+0

Tak, ponieważ podawał przeciw-przykład do przypadku w artykule , gdzie singleton nie jest naprawdę leniwy, ponieważ może zostać stworzony zanim będzie potrzebny. – BeeOnRope

+0

Ah w porządku, ale w implementacjach Singleton zwykle masz tylko jedną statyczną metodę, która zwraca instancję, a wszystkie inne metody są niestatyczne, prawda? – fredoverflow

Powiązane problemy