在scala中,有没有办法检查实例是否是单例对象?

时间:2016-03-15 17:39:50

标签: scala

如果我有一个对象的实例,有没有办法检查我是否有一个单例对象而不是一个类的实例? 有没有办法可以做到这一点?可能是一些反思API? 我知道一个区别是单个对象的类名以$结尾,但这不是一个严格的方法。

2 个答案:

答案 0 :(得分:22)

是的,使用记录很少的scala.Singleton类型:

def isSingleton[A](a: A)(implicit ev: A <:< Singleton = null) = 
  Option(ev).isDefined

然后:

scala> val X = new Foo(10)
X: Foo = Foo@3d5c818f

scala> object Y extends Foo(11)
defined object Y

scala> isSingleton(X)
res0: Boolean = false

scala> isSingleton(Y)
res1: Boolean = true

我的isSingleton方法只是一个演示,提供一个运行时布尔值,告诉您表达式是否静态类型为单例类型,但您也可以在编译时使用Singleton作为证据类型为单例类型的时间。

答案 1 :(得分:0)

以下是我找到解决此问题的最佳方案:

import scala.reflect.runtime.currentMirror
def isSingleton(value: Any) = currentMirror.reflect(value).symbol.isModuleClass

基于How to determine if `this` is an instance of a class or an object?