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

时间:2011-05-25 13:23:01

标签: scala object singleton language-features library-design

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

object Foo {
  val Bar = new Baz(42, "The answer", true)
}

还是这个?

object Foo {
  object Bar extends Baz(42, "The answer", true)
}

2 个答案:

答案 0 :(得分:8)

两个结构之间的功能差异在于object Bar仅在需要时创建,而val Bar只在使用object Foo时创建。实际上,这意味着如果右侧价格昂贵且不一定需要,则应使用对象(或lazy val)。否则,val可能更简单。

另请注意,如果班级Baz是最终版,则您将无法使用object样式,因为您无法扩展Baz(尽管您仍然可以使用lazy val如果你想推迟创作直到需要它。

答案 1 :(得分:2)

我说第一个,因为在第二个,你正在创建一个新类,但不添加任何信息(没有覆盖方法,值或新的)。