用于不可变的最终单例对象的val或对象

soc*_*soc 7 singleton language-features scala object library-design

考虑到变化是源兼容的,通常应该选择哪种解决方案?

这个

object Foo {
  val Bar = new Baz(42, "The answer", true)
}
Run Code Online (Sandbox Code Playgroud)

或这个?

object Foo {
  object Bar extends Baz(42, "The answer", true)
}
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 8

两个构造之间的功能差异object Bar仅在需要时才创建,而val Barobject Foo使用时立即创建.实际上,这意味着lazy val如果右侧价格昂贵且不总是需要,则应使用对象(或).否则,val可能更简单.

此外,请注意,如果该类Baz是最终的,您将无法使用该object样式,因为您无法扩展Baz(尽管lazy val如果您想在需要时推迟创建,仍然可以使用该样式).