Scala中的“新”关键字

我有一个非常简单的问题 – 我们应该在Scala中创build对象时何时应用new关键字? 是否当我们只尝试实例化Java对象?

当你想引用一个class的构造函数时,使用new关键字:

 class Foo { } val f = new Foo 

如果您引用了随播广告对象的apply方法,则省略new

 class Foo { } object Foo { def apply() = new Foo } // Both of these are legal val f = Foo() val f2 = new Foo 

如果你已经做了一个案例课:

 case class Foo() 

Scala秘密地为你创build一个伴侣对象,把它变成这样:

 class Foo { } object Foo { def apply() = new Foo } 

所以你可以做

 f = Foo() 

最后,请记住,没有任何规则表明,同伴apply方法必须是构造函数的代理:

 class Foo { } object Foo { def apply() = 7 } // These do different things > println(new Foo) test@5c79cc94 > println(Foo()) 7 

而且,由于您提到了Java类:是的–Java类很less有伴侣对象,因此您必须使用new和实际的类的构造函数。

是否当我们只尝试实例化Java对象?

一点也不。 当你在scala中省略new时候有两种一般情况。 使用单例对象(通常用于存储静态函数,以及类似于java中所见的工厂types):

 scala> object LonelyGuy { def mood = "sad" } defined module LonelyGuy scala> LonelyGuy res0: LonelyGuy.type = LonelyGuy$@3449a8 scala> LonelyGuy.mood res4: java.lang.String = sad 

对于一个案例类 (实际上,下面有类+对象= 伴侣模式,例如具有相同名称的类和对象):

 scala> case class Foo(bar: String) defined class Foo scala> Foo("baz") res2: Foo = Foo(baz) 

所以当你使用一个简单的类时,规则和Java一样。

 scala> class Foo(val bar: String) defined class Foo scala> new Foo("baz") res0: Foo = Foo@2ad6a0 // will be a error scala> Foo("baz") <console>:8: error: not found: value Foo Foo("baz") 

奖金,斯卡拉有一个匿名类,可以这样构造:

 scala> new { val bar = "baz" } res2: java.lang.Object{val bar: java.lang.String} = $anon$1@10ee5b8 scala> res2.bar res3: java.lang.String = baz