5

In un article sul linguaggio ricontrollato bloccaggio, ho trovato questa citazione:inizializzazione differita gratuitamente

Un caso particolare di inizializzazione differita che funziona come previsto senza sincronizzazione è singleton statico. Quando l'oggetto inizializzato è un campo statico di una classe senza altri metodi o campi, la JVM esegue automaticamente l'inizializzazione pigra automaticamente.

Perché la parte enfatizzata è importante? Perché non funziona se ci sono altri metodi o campi?

(L'articolo è già più di 10 anni. L'informazione è ancora attuale?)

+0

+1 domanda interessante. Inizialmente la mia ipotesi sarebbe stata quella che è l'unica volta in cui la JVM può essere certa che non ci sarà una chiamata su quell'oggetto prima che venga referenziato dall'esterno della classe; ma questo non sembra illuminare nulla. –

risposta

4

Che cosa significa è probabilmente che, se una classe non ha altri metodi o campi, poi si accede solo per la singleton, quindi il singleton viene creato solo quando richiesto. In caso contrario, per esempio

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

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

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

qui, foo stato istanziato, anche se non è mai stato chiesto.

Ma va bene disporre di metodi/campi statici privati, quindi altri non attivano l'inizializzazione della classe per errore.

+0

* "un campo statico di una classe senza altri metodi o campi" * - ma nell'esempio Foo ** ha ** un metodo x() – mantrid

+0

Sì, perché stava dando il contro-esempio al caso nell'articolo , dove il singleton non è realmente pigro perché potrebbe essere creato prima che sia necessario. – BeeOnRope

+0

Ah ok, ma nelle implementazioni Singleton, in genere si ha solo un metodo statico che restituisce l'istanza e tutti gli altri metodi non sono statici, giusto? – fredoverflow