簡體   English   中英

Scala中的“new”關鍵字

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM