【问题标题】:val or object for immutable, final singleton object用于不可变的最终单例对象的 val 或对象
【发布时间】:2011-05-25 13:23:01
【问题描述】:

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

这个

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

还是这个?

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

【问题讨论】:

  • 如果您想在未来以不同方式模块化您的 API 而无需太多修改,我会说第一个会更好...但由于更改与源代码兼容,您可以保留第二个直到需要。跨度>

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


【解决方案1】:

这两种构造的功能区别在于object Bar 仅在需要时创建,而val Bar 在使用object Foo 时立即创建。实际上,这意味着如果右侧很昂贵并且并不总是需要,您应该使用该对象(或lazy val)。否则,val 可能更简单。

另外,请注意,如果 Baz 是 final 类,您将无法使用 object 样式,因为您无法扩展 Baz(尽管您仍然可以使用 lazy val 如果您愿意推迟创建直到需要)。

【讨论】:

  • 对不起,我不够清楚。我的意思是final 变量Bar 不会被重新分配。 object 的字节码不是比lazy val 的代码简单吗?
  • @soc - 是的,lazy val 是更复杂的代码(并且是线程安全的)。我编辑了我的答案,以更清楚地说明我对 final 的含义。
  • @soc - 我觉得不像;对象初始化程序代码似乎不是线程感知的。你可以检查字节码。
  • Afaik 它使用与 Java 中的单例枚举相同的策略,其中 VM 保证线程安全,而不是字节码。
  • @soc - 可能。这不是我非常熟悉的东西。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2013-01-25
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多