Se ho un'istanza di un oggetto, c'è un modo per verificare se ho un oggetto Singleton piuttosto che un'istanza di una classe? C'è qualche metodo può farlo? Può essere qualche API di riflessione? So che una differenza è che il nome classe di un oggetto singleton termina con uno $
, ma questo non è un modo rigoroso.In scala, c'è un modo per verificare se un'istanza è un oggetto singleton o no?
10
A
risposta
22
Sì, usando il poco documentato scala.Singleton
tipo:
def isSingleton[A](a: A)(implicit ev: A <:< Singleton = null) =
Option(ev).isDefined
E poi:
scala> val X = new Foo(10)
X: Foo = [email protected]
scala> object Y extends Foo(11)
defined object Y
scala> isSingleton(X)
res0: Boolean = false
scala> isSingleton(Y)
res1: Boolean = true
Il mio metodo isSingleton
è solo una dimostrazione che fornisce un valore di runtime booleano che indica se o no un'espressione è tipizzata staticamente come un tipo singleton, ma è possibile utilizzare anche Singleton
come prova al momento della compilazione che un tipo è un tipo singleton.
0
Ecco cosa ho trovato la migliore soluzione a questo problema:
import scala.reflect.runtime.currentMirror
def isSingleton(value: Any) = currentMirror.reflect(value).symbol.isModuleClass
Base sul How to determine if `this` is an instance of a class or an object?
Perché non usare 'ev ne null' invece di' Opzione (ev) .isDefined'? – Clashsoft
@Clashsoft Nessun motivo particolare. Il valore di default 'null' è una specie di hack, e dal momento che non è proprio il punto che volevo mantenere le cose come principi altrimenti possibile. –
Inoltre, sei sicuro che 'scala.Singleton' (ancora) esiste? Non è nella documentazione '2.11', e non si trova nemmeno nel repository GitHub? Forse potresti aggiungere un link – Clashsoft