[英]“new” keyword in Scala
我有一個非常簡單的問題 - 在Scala中創建對象時應該何時應用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秘密為你創建了一個伴侶對象,將其轉化為:
class Foo { }
object Foo {
def apply() = new Foo
}
所以你可以做到
f = Foo()
最后,請記住,沒有規則表明companion apply
方法必須是構造函數的代理:
class Foo { }
object Foo {
def apply() = 7
}
// These do different things
> println(new Foo)
test@5c79cc94
> println(Foo())
7
而且,既然你提到了Java類:是的 - Java類很少有帶有apply
方法的伴隨對象,所以你必須使用new
和實際類的構造函數。
是在我們嘗試僅實例化java對象時?
一點也不。 在scala中省略new
時有兩種常見情況。 使用單例對象(通常用於存儲靜態函數,並且作為一種類似於您在java中看到的工廠):
scala> object LonelyGuy { def mood = "sad" }
defined module LonelyGuy
scala> LonelyGuy
res0: LonelyGuy.type = LonelyGuy$@3449a8
scala> LonelyGuy.mood
res4: java.lang.String = sad
使用案例類 (實際上,下面有class + object = 伴隨模式,例如,具有相同名稱的類和對象):
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中有一個匿名類,可以像這樣構造:
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
是在我們嘗試僅實例化Java對象時?
使用Scala 3(應該在2020年中期,8年后發布), 基於Dotty :永遠不會。
Scala 3將丟棄“ new
”,就像在這個帖子中一樣
即使沒有實現apply方法,Creator應用程序也允許使用簡單的函數調用語法來創建類的實例。
例:
class StringBuilder(s: String) {
def this() = this(s)
}
StringBuilder("abc") // same as new StringBuilder("abc")
StringBuilder() // same as new StringBuilder()
Creator應用程序概括了目前為止僅為案例類提供的功能,但實現此功能的機制略有不同。
我們在函數調用f(args)
添加了一個新的可能解釋,而不是自動生成的apply方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.