Questo è molto diffuso codice enum singoletto:Singleton via enum way è pigro inizializzato?
public enum enumClazz{
INSTANCE
enumClazz(){
//do something
}
}
e un mazzo di posti detto che è un inizializzazione ritardata. Ma io sono confuso dopo aver letto il capitolo 7 della 'Inside the Java Virtual Machine' - la durata di una Tipo:
La specifica Java virtual machine dà implementazioni flessibilità nella tempistica di classe e l'interfaccia di caricamento e il collegamento, ma rigorosamente definisce i tempi di inizializzazione. Tutte le implementazioni devono inizializzare ogni classe o interfaccia al primo utilizzo attivo. Sei situazioni seguenti qualificano usi attive:
- viene creata una nuova istanza di una classe (in bytecode, l'esecuzione di una nuova istruzione alternativa, tramite la creazione implicita, riflessione, clonazione o deserializzazione..)
- l'invocazione di un metodo statico dichiarata da una classe (in bytecode, l'esecuzione di un'istruzione invokestatic)
- l'uso o cessione di un campo statico dichiarata da una classe o interfaccia, tranne per i campi statici che sono finale e inizializzato da un'espressione costante in fase di compilazione (in bytecode s, l'esecuzione di un getstatic o istruzione putstatic)
- L'invocazione di taluni metodi riflettenti API Java, come i metodi della classe classe o delle classi nel java.lang.reflect pacchetto
- L'inizializzazione di una sottoclasse di una classe (inizializzazione di una classe richiede prima inizializzazione della sua superclasse.)
- la designazione di una classe come classe iniziale (con la principale < metodo()) quando una macchina virtuale Java avvia
Il terzo punto con stile grassetto chiarisce che se il campo è static final
, l'inizializzazione del campo è avvenuta in fase di compilazione. Allo stesso modo, INSTANCE
in enumClazz
è implicitamente uguale a public static final
e conforme al terzo punto.
Qualcuno può correggermi se la mia comprensione è sbagliata?
class Singleton {public static final instance = new Singleton(); ...} Quindi, per la classe generica, questa 'instance' è pigra inizializzata? –
Sì, sarebbe inizializzato pigramente allo stesso modo. – assylias
Tutto azzerato. Grazie mille :) –