Scala:单例对象与匿名类



在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)
}

它们之间有一个明显的区别,我将解释:

object的行为与lazy val类似。事实上,它可以被视为具有匿名类的lazy val定义的简写描述了CCD_ 4的内容。

这个描述直接取自《Scala编程》第四版(第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

正如您所看到的,当您实例化一个匿名类时。在初始化参考CCD_ 6之前对CCD_。这与Demo不同。Val a只在对象Demo首次使用的地方初始化,也就是打印对象的行,而不是在定义对象的地方初始化。

当您希望以更具功能性和/或在内存方面更高效的方式进行编码时,应该使用对象。因为对象是延迟求值的,所以如果需要的话,它们会在需要的时候得到精确的求值。如果不需要它们,就不会对它们进行评估。因此,您可以避免内存开销,例如,如果匿名类的评估是一项计算密集型操作,那么如果您在企业应用程序中使用大量匿名类,这可能会有所不同。

相关内容

  • 没有找到相关文章

最新更新