在 scala 中创建一个 var/val 的单例 class

Create a var/val of singleton class in scala

我创建了一个 class 作为 :

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;
}

我知道对象 StandaloneFactory 将有一个单独的实例作为 StandaloneFactory。我只想创建一个 Standalonefactory 的 var/val,所以我尝试这样做:

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 中的别名有关。我不明白发生了什么。请帮助我理解这一点。

谢谢。

作为一个对象,StandaloneFactory 是一个,而不是一个类型。它是某些类型的唯一实例,其名称对您来说并不明显,但可以作为 StandaloneFactory.type 使用。生成类型的名称,目前是通过向对象名称添加 $ —— 在本例中为 StandaloneFactory$。编译后你会看到这样一个class文件。

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

the class definition defines the name Point in the type name space, whereas the object definition defines a name in the term namespace.

讨论了两个名称空间 here。 "type namespace" 用于引用类型的符号,"term namespace" 用于引用 instances 的符号类型。

只是为了 crystal 说清楚,当你说 object StandaloneFactory 您创建了一个类型(其名称是 StandaloneFactory$,而不是 StandaloneFactory 一个值 StandaloneFactory(指向 [=13 的唯一实例=]).一开始您可能会感到惊讶,值 StandaloneFactory 没有指向类型 StandaloneFactory 的实例,但是如果您了解伴生对象和大小写 classes,您就会意识到伴生对象对于类型是与类型完全不同的动物;它必须有自己的 类型。