If I have an instance of an object, is there a way to check if I have a singleton object rather than an instance of a class?
Is there any method can do this? May be some reflection API?
I know that one difference is that the class name of a singleton object ends with a $, but this is not a strict way.
            Asked
            
        
        
            Active
            
        
            Viewed 1,082 times
        
    10
            
            
         
    
    
        Alberto Bonsanto
        
- 17,556
- 10
- 64
- 93
 
    
    
        SleePy
        
- 127
- 7
2 Answers
22
            Yep, using the little-documented scala.Singleton type:
def isSingleton[A](a: A)(implicit ev: A <:< Singleton = null) = 
  Option(ev).isDefined
And then:
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
My isSingleton method is just a demonstration that provides a runtime boolean value that tells you whether or not an expression is statically typed as a singleton type, but you can also use Singleton as evidence at compile time that a type is a singleton type.
 
    
    
        Travis Brown
        
- 138,631
- 12
- 375
- 680
- 
                    Why not use `ev ne null` instead of `Option(ev).isDefined`? – Clashsoft Mar 15 '16 at 19:42
- 
                    @Clashsoft No particular reason. The `null` default value is kind of a hack, and since it's not really the point I just wanted to keep things as principled otherwise as possible. – Travis Brown Mar 15 '16 at 19:43
- 
                    Also, are you sure `scala.Singleton` (still) exists? It's not in the `2.11` documentation, and it's not to be found in the GitHub repo either? Maybe you could add a link – Clashsoft Mar 15 '16 at 19:47
- 
                    @Clashsoft It's definitely [still there](https://github.com/scala/scala/search?utf8=%E2%9C%93&q=Singleton), but (as I note) not very documented. – Travis Brown Mar 15 '16 at 19:51
- 
                    It seems to be a [compiler builtin existential type](https://github.com/scala/scala/search?utf8=%E2%9C%93&q=singletonclass&type=Code) (that also gets erased, so no `.isInstanceOf[Singleton]`). – Clashsoft Mar 15 '16 at 19:55
- 
                    Is there any documentation/mention about this at all? – Jasper-M May 23 '16 at 14:29
- 
                    @Jasper-M Well, it's mentioned a couple of times in the language specification, but no, not really. – Travis Brown May 23 '16 at 15:14
0
            
            
        Here's what I found the best solution to this problem:
import scala.reflect.runtime.currentMirror
def isSingleton(value: Any) = currentMirror.reflect(value).symbol.isModuleClass
Base on How to determine if `this` is an instance of a class or an object?
 
    
    
        Community
        
- 1
- 1
 
    
    
        Martin Tapp
        
- 3,106
- 3
- 32
- 39