【问题标题】:Can companion object extend some trait different from companion class?伴生对象可以扩展一些与伴生类不同的特征吗?
【发布时间】:2018-02-26 11:55:14
【问题描述】:

我一直按应有的方式使用伴生对象:具有某些类或特征,我在同一个文件中定义了具有相同类名的对象。 但我目前正在尝试排除一些伴随对象共享的常见功能,并想知道拥有这样的东西是否安全:

trait Label {
  def label: String
}

trait InstancesMap[T <: Label] {
  private var instances = Map.empty[String, T]
  def init(instance: T): T = {
    instances += (instance.label -> instance)
    instance
  }
  def byLabel(label: String): T = instances(label)
}

case class EventStatus(label: String) extends Label

object EventStatus extends InstancesMap[EventStatus] {
  val DRAFT = init(EventStatus("draft"))
  val PUBLISHED = init(EventStatus("published"))
}

我不确定案例类伴随对象扩展其他特性是否安全。它可以编译并且工作正常,但很高兴听到一些意见。

【问题讨论】:

  • 可以,但请注意,同样说明的可变性可能会导致坏事
  • 你能推荐如何在我无法重新分配给任何东西的对象的上下文中将这样的东西转换为不可变的吗?在我的特定示例中,我知道这些伴随对象的使用位置,因此它们将始终绑定到一个线程,但仍然很高兴听到如何以不变性来处理这一点。
  • ...至少var 应该是私有的并且可能是volatile
  • 是的,我完全同意这一点。谢谢

标签: scala


【解决方案1】:

当然可以,就像非同伴objects 一样。这实际上是将“静态”表示为伴随对象的主要优点之一。扩展类而不是 trait 也可以。

您可以在标准库中看到它,其中集合伴随对象扩展 GenericCompanion 及其各种子类型。

【讨论】:

    猜你喜欢
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多