【发布时间】: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