2012-12-13 25 views
10
public class MySingleton{ 
    private static final MySingleton INSTANCE = new MySingleton(); 
    private MySingleton(){} 
    public static getInstance(){ 
    return INSTANCE; 
    } 
} 

È questo il modo giusto per implementare un Singleton. Se sì, qual è la necessità della parola chiave finale?La parola chiave finale è necessaria nella classe Singleton Java?

+8

Non è necessario, ma è buona norma mostrare che il valore è costante. –

risposta

0

non proprio necessario. ma usando final non può essere resettato dalla classe singleton stessa, che impone un vero singleton. Tuttavia, poiché i singleton sono una cattiva pratica, possono essere resi utilizzabili per i test unitari aggiungendo un metodo setInstance(). Le persone ansiose potrebbero definire setInstance private, in modo tale che l'unit test chiami il setInstance, tramite la reflection.

+0

i membri finali non sono inizializzati solo una volta? come può essere resettato? –

+0

@ user1189932 hai perso una parola: ho scritto non resettato – AlexWien

+0

cool grazie mille per la risposta rapida. –

2

Final garantisce che l'istanza non sia modificabile dopo la creazione. Se includi solo un costruttore e nessun setter, non è un grosso problema. Nessuno può cambiare il tuo INSTANCE e non lo stai cambiando.

Non è una cattiva idea lasciarlo lì nel caso in cui la classe venga in seguito modificata. L'immutabilità offre alcuni vantaggi (serializzazione semplificata, assicurazione contro qualcuno che cambia il tuo oggetto dietro la schiena, ecc.).

È più difficile restituire l'immutabilità che non estrarla. Scrivi il tuo codice in modo difensivo in modo che nessuno possa rovinarlo più tardi.

2

L'approccio generalmente preferito è quello di utilizzare un enum

public enum MySingleton { 
    INSTANCE; 
} 

Nel tuo esempio la parola finale mostra l'intenzione e impedirà riassegnazione (= bug), ma non è strettamente necessario.

In particolare, la variabile è statica, non è necessario che sia definitiva per essere pubblicata in modo sicuro in un ambiente a più thread.

+0

enum singleton è una pessima idea ... – irreputable

+0

Puoi elaborare? I singleton – assylias

+0

non sono affatto validi, i singleton enumerati non possono essere resettati dai test unitari.quindi è un vero singleton malvagio, il peggio che può accadere. – AlexWien

1

Non esiste un modo giusto per implementare lo schema di singleton in Java, tuttavia l'uso di una variabile di istanza finale statica pubblica è un buon approccio purché non sia necessario il caricamento lento e si possa vivere con le conseguenze per il test dell'unità.

Se il test dell'unità è un problema e si desidera comunque un singleton, è consigliabile utilizzare l'iniezione delle dipendenze. Ciò consentirà di configurare un'istanza ordinaria con un ciclo di vita Singleton.

Il modificatore finale consente al compilatore e al runtime Java di effettuare buone decisioni di ottimizzazione e sicurezza del thread. Userei sempre la finale con questo stile di dichiarazione singleton. Direi che si tratta di una cattiva scelta progettuale per consentire a un'istanza singleton di essere mutabile, perché il codice client non può più fare affidamento sul fatto di vedere lo stesso valore per tutta la durata del processo.

E 'possibile affrontare la questione unit testing con una classe factory configurabile:

private static final MySingleton INSTANCE = MySingletonFactory.create(); 

... senza perdere i benefici della finale.

Problemi correlati