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