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