在scala中创建单例类的var / val

时间:2015-06-26 05:45:45

标签: scala singleton

我创建了一个类:

class Standalone(val str:String)
{
    Console println "Creating : "+this;
    override def toString()= " str : "+str;
}
object StandaloneFactory
{
    private val standalones= Map("red"-> new Standalone("Red"),"blue"-> new Standalone("Blue"),"green"-> new Standalone("green"));
    def getColor(color : String) = if(standalones.contains(color)) standalones(color) else null;
}

我知道Object StandaloneFactory将有一个实例作为StandaloneFactory。我只是想创建一个varalone的Standalonefactory,所以我尝试了这个:

object StandaloneMain
{
    def main(args:Array[String])
    {
        var stdFac:StandaloneFactory= StandaloneFactory;
        Console println stdFac;
        Console.println(StandaloneFactory.getColor("red")); 
    }
}

但是这不会编译并给出如下错误: 错误:找不到:输入StandaloneFactory

现在我改变了

var stdFac:StandaloneFactory= StandaloneFactory;

var stdFac:StandaloneFactory.type= StandaloneFactory;

var stdFac= StandaloneFactory;

代码编译并成功运行。 我认为它与scala中的别名有关。我没有得到正在发生的事情。请帮我理解这一点。

感谢。

1 个答案:

答案 0 :(得分:2)

作为对象,StandaloneFactory,而不是类型。它是某种类型的唯一实例,其名称对您来说并不明显,但可以StandaloneFactory.type的形式提供。生成类型的名称,目前通过向对象名称添加$ - 在本例中为StandaloneFactory$。编译完成后,您将看到这样的类文件。

您要求提供参考,说明object StandaloneFactory创建的值StandaloneFactory而不是该名称的类型。请参阅Scala语言规范中this page的底部,其中创建了一个名为Point的类和一个对象,并显示

  

类定义在类型名称空间中定义名称Point,   而对象定义在术语名称空间中定义了一个名称。

讨论了两个名称空间here。 "类型命名空间"用于引用类型的符号,以及" term namespace"用于引用类型的 实例 的符号。

当你说时,这里要说清楚 object StandaloneFactory 您创建了一个类型(其名称为StandaloneFactory$,而不是StandaloneFactory一个值StandaloneFactory(指向StandaloneFactory$的唯一实例) 。您可能会感到惊讶的是,值StandaloneFactory并未指向类型StandaloneFactory的实例,但如果您了解伴随对象和案例类,您将意识到类型的伴随对象是完全的不同类型的动物;它必须有自己的类型。