In rete circolano diverse soluzioni per implementare in VB.NET il pattern Singleton
, che ha lo scopo di garantire che, di una determinata classe, sia creata una ed una sola istanza e che questa sia accessibile globalmente. Qui presento l’implementazione di Evgeniy Sukhikh (vedi riferimenti).
Nella soluzione di Evgeniy, la classe presenta tre elementi fondamentali: la ridefinizione del costruttore, una proprietà che espone un’istanza della classe e – all’interno di quest’ultima – la variabile che venga restituita dalla proprietà (no, non abbiamo sconfinato in C#, casomai vi fosse sorto il dubbio). Vediamo l’esempio e poi discutiamo i tre elementi.
Public Class MySingleton Private Sub New() End Sub Public Shared ReadOnly Property GetInstance As MySingleton Get Static instance As Singleton = New MySingleton Return instance End Get End Property End Class
La prima cosa che salta all’occhio (o dovrebbe) è che il costruttore è stato definito con accesso Private
; in questo modo si impedisce di implementare la classe… al di fuori di sé stessa. Un attimo di pazienza e tutto sarà più chiaro.
Poi notiamo che è stata definita una proprietà ReadOnly
e soprattutto Shared
(condivisa); per chi non lo sapesse o lo ricordasse, un membro Shared
viene condiviso tra tutte le istanze di quella classe. Nel nostro caso poi, l’istanza comunque potrà essere una sola. In questo caso la proprietà GetInstance
restituisce un oggetto definito di classe MySingleton
. Va da sé che GetInstance
e MySingleton
sono nomi da me arbitrariamente attribuiti.
A garantire l’univocità dell’istanza infine contribuisce infine la variabile instance
(nome ancora arbitrario) all’interno della proprietà, sempre di tipo MySingleton
, definita come Static
(statica). La parola chiave Static
, che può essere applicata solo a variabili locali ad un procedura o ad un blocco all’interno della procedura, fa sì che la variabile non cessi di esistere con la chiusura del blocco di codice nel quale è stata definita, ma soprattutto non venga reinizializzata qualora l’esecuzione ritornasse entro quel blocco di codice.
La diretta conseguenza dell’uso di una variabile Static
come valore di ritorno di una proprietà ReadOnly
e Shared
è che esisterà una ed una sola istanza della classe MySingleton all’interno dell’intera applicazione.
Riferimenti
Ciao,
Mi rendo conto che questo articolo ha 14 anni e che quindi magari il mio commento lascia il tempo che trova, ma credo che il codice sia sbagliato
Public Shared ReadOnly Property GetInstance As Singleton
dovrebbe essere as mySingleton visto che la classe l’hai chiamata così
Ciao!
Hai perfettamente ragione, ho corretto il codice. Grazie mille per la segnalazione!