通过导入扩展实例化对象:坏主意?

时间:2013-12-06 21:49:30

标签: scala functional-programming immutability

我有许多City个对象的列表,在创建后的某个时刻,它们会被标记,因此每个对象都会设置一个Label字段。

我希望以功能无状态的方式执行此操作,即不设置默认值并使用var。我真的很好奇最佳做法是什么。

我有这个工作的例子,但我觉得很有趣。请特别注意,我import - 现有的City个对象,当我拨打City.addLabel(label)时会发生这种情况。

case class LabelledCity(importCity: CityLike, label: Label) extends CityLike with Labelled 
{
  val cityState = importCity.cityState
  val income = importCity.income
}

case class City(string: String) extends CityLike {
  val split = string.split(" --- ")
  val cityState = split(0)
  val income = split(1).toInt
}

abstract class CityLike {
  def addLabel(l: Label): LabelledCity = { new LabelledCity(this, l) }
  val cityState: String
  val income: Int
}

这一切都有点不对劲,或者说我错过了一些简单的事情......是吗?

1 个答案:

答案 0 :(得分:4)

以下是存档的不可变方法(为了简单起见,我删除了类主体):

case class City(string: String, label: Option[String] = None)
val unknown = City("somestring")
// unknown: City = City(somestring,None)
val washington = unknown.copy(label = Some("Washington"))
// washington: City = City(somestring,Some(Washington))