在Scala中拥有“setter”的正确方法?

时间:2018-01-08 19:21:39

标签: java scala setter case-class

如果在Java类中成员的setter中有一些逻辑或数据清理,对于Scala案例类,做同样的事情的正确和普遍认可的方法是什么?

断言?实现自己的apply方法?

1 个答案:

答案 0 :(得分:1)

一种选择是使用deflazy val来获取转换后的值。 E.g。

case class PostalCode(value: String) {
  lazy val clean: String = value.replaceAll(" ","").toUpperCase
}

另一种选择,如果您不希望原始值徘徊,和/或您想要抛出异常或因输入错误而失败:

case class PostalCode(value: String)
case object PostalCode {
  def parse(s: String): Option[PostalCode] = try {
    Some(PostalCode(someThrowingLogic(s)))
  }
  catch {
    case e: Exception => None
  }
  def clean(s: String): PostalCode = PostalCode(s.replaceAll(" ","").toUpperCase)
}

这使得用户仍然可以使用普通构造函数而不是PostalCode.parsePostalCode.clean。这是另一种选择;

trait PostalCode {
  def value: String
}
case object PostalCode {
  private case class PCImpl(value: String) extends PostalCode
  def apply(v: String): PostalCode = v.replaceAll(" ","") match {
    case s if s.length == 6 =>
      PCImpl(s.toUpperCase)
    case _ =>
      throw new IllegalArgumentException(v + " is not a valid postal code.")
}