Nel fare l'inizializzazione pigra di un Singleton statica in Java si può fare questo:Possiamo ottenere un caricamento pigro indolore di un membro Java in modo simile al modo in cui possiamo farlo con i singleton statici?
public class Bob {
private static class SingletonWrapper {
private static final Bob instance = new Bob();
}
public static Bob getInstance() {
return SingletonWrapper.instance;
}
}
Perché la classe interna SingletonWrapper
viene caricata solo quando prima accede alla Bob()
non viene creato fino getInstance()
si chiama.
La mia domanda è se esistono trucchi simili che possono essere utilizzati per eseguire un'istanza lazy di una variabile membro in un contesto non statico.
public class Bob {
// Clearly this doesn't work as not lazy
private final InnerWrapper wrapper = new InnerWrapper();
private class InnerWrapper {
private final Jane jane = new Jane();
}
public Jane getJane() {
return wrapper.jane;
}
}
C'è un modo possiamo avere un esempio di Jane
all'interno Bob
e infilare sicuro avere l'istanza creato solo su richiesta senza utilizzare interblocco ricontrollato o AtomicReference
. Idealmente, il metodo get dovrebbe rimanere semplice come quello di questi esempi, ma se ciò non è possibile, l'esecuzione più semplice e più rapida possibile (più efficiente) del metodo get
sarebbe l'ideale.
@assylias Come il commento dice che non sarebbe fare l'inizio pigro. Non appena crei un 'Bob', crei sempre e immediatamente un' Jane'. –
I miei cattivi ho letto troppo velocemente - qualche motivo per cui non vuoi un AtomicReference? Potrebbe avere prestazioni migliori rispetto all'opzione CHM. – assylias
@assylias Nessun motivo specifico. Fondamentalmente voglio solo sapere quali sono le mie opzioni - considerando quanto sia semplice ed efficace il trucco del wrapper statico per l'inizializzazione pigra dei singletons è un peccato non riuscire a trovare qualcosa di simile per l'inizializzazione pigra dei membri, –