Если у меня есть экземпляр объекта, есть ли способ проверить, есть ли у меня объект singleton, а не экземпляр класса?
Можно ли это сделать? Может быть, какой-то отраженный API?
Я знаю, что одно отличие состоит в том, что имя класса одноэлементного объекта заканчивается на $
, но это не является строгим способом.
В scala есть ли способ проверить, является ли экземпляр одиночным объектом или нет?
Ответ 1
Да, используя мало документированный тип scala.Singleton
:
def isSingleton[A](a: A)(implicit ev: A <:< Singleton = null) =
Option(ev).isDefined
И затем:
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
Мой метод isSingleton
представляет собой просто демонстрацию, которая обеспечивает булевское значение времени выполнения, которое сообщает вам, является ли выражение статически типизированным как одноэлементный тип, но вы также можете использовать Singleton
как доказательство во время компиляции, когда тип является одноэлементным типом.
Ответ 2
Вот что я нашел наилучшим решением этой проблемы:
import scala.reflect.runtime.currentMirror
def isSingleton(value: Any) = currentMirror.reflect(value).symbol.isModuleClass
База на Как определить, является ли` this` экземпляром класса или объекта?