Scala特性实现

Scala特性实现,scala,traits,case-class,Scala,Traits,Case Class,我有一个案例课: case class EvaluateAddress(addressFormat: String, screeningAddressType: String, value: Option[String]) { } 直到我有了一个新的用例,其中“value”参数可以是一个类对象而不是字符串,这一切都很顺利 我处理此用例的初始实现: case class Evalu

我有一个案例课:

case class EvaluateAddress(addressFormat: String,
                             screeningAddressType: String,
                             value: Option[String]) {
}
直到我有了一个新的用例,其中“value”参数可以是一个类对象而不是字符串,这一切都很顺利

我处理此用例的初始实现:

case class EvaluateAddress(addressFormat: String,
                             screeningAddressType: String,
                             addressId: Option[String],
                             addressValue: Option[MailingAddress]) {

  @JsonProperty("value")
  def setAddressId(addressId: String): Unit = {
    val this.`addressId` = Option(addressId)
  }

  def this(addressFormat: String, screeningAddressType: String, addressId: String) = {
    this(addressFormat, screeningAddressType, Option(addressId), None)
  }

  def this(addressFormat: String, screeningAddressType: String, address: MailingAddress) = {
    this(addressFormat, screeningAddressType, None, Option(address))
  }
}
但我觉得这不是一个好方法,它可能会在将来产生一些问题

我可以通过哪些不同的方式实现相同的目标


编辑:是否有一种方法可以创建一个包含三个参数的类:*addressFormat、screeningAddressType、value**并处理这两个用例?

您可以为案例类中的字段设置默认值

因此,您可以将可选字段默认设置为
None

case class EvaluateAddress(addressFormat: String,
                             screeningAddressType: String,
                             addressId: Option[String] = None,
                             addressValue: Option[MailingAddress] = None)

然后,当您创建
EvaluateAddress
的新实例时,您可以选择为
addressId
addressValue
或两者中的任何一个传递值。

您不需要在此处提供辅助构造函数,也不需要设置器。您可以简单地使用case类提供的copy方法

例如:

case class MailingAddress(email:String)
case class EvaluateAddress(addressFormat: String,
                             screeningAddressType: String,
                             addressId: Option[String],
                             addressValue: Option[MailingAddress])

scala> val y = EvaluateAddress("abc", "abc", None, None)
y: EvaluateAddress = EvaluateAddress(abc,abc,None,None)

scala> y.copy(addressId = Some("addressId"))
res0: EvaluateAddress = EvaluateAddress(abc,abc,Some(addressId),None)