在 Scala 中,內部單例物件和匿名內部類似乎達到了相同的目的。它們之間有什么區別,我應該什么時候更喜歡使用其中一種?
內部單例物件:
object Main extends App {
object A {
val a = 7
}
println(A.a)
}
匿名內部類:
object Main extends App {
val A = new {
val a = 7
}
println(A.a)
}
uj5u.com熱心網友回復:
它們之間有一個明顯的區別,我將解釋:
An 的
object行為類似于lazy val. 事實上,它可以看作是 a 定義的簡寫,lazy val帶有一個描述 的內容的匿名類object。
此描述直接取自Programming in Scala 4th Ed。(第 20 章。抽象成員。第 20.5 節初始化抽象 vals)作者:M. Odersky、B. Venners 和 L. Spoon。
這是一個示例,它顯示了差異:
object Program extends App {
object Demo {
val a = {
println("initializing a from Demo")
7
}
}
val A = new {
val a = {
println("initializing a from A")
8
}
}
println(Demo.a)
println(A.a)
}
輸出:
initializing a from A
initializing a from Demo
7
8
如您所見,當您實體化一個匿名類時。在初始化Val a參考之前進行評估。A這與Demo. Val a僅在Demo第一次使用物件的地方初始化,即列印它的行,而不是定義它的地方。
當您想要撰寫更實用的代碼和/或在記憶體方面更高效時,您應該使用物件。因為物件是惰性求值的,所以它們會在需要時準確地求值,如果需要的話。如果不需要它們,則不會對其進行評估。因此,您可以避免記憶體開銷,例如,如果匿名類的評估是計算密集型操作,那么如果您在企業應用程式中使用大量此類操作,這可能會有所不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496944.html
