在 Scala 中使用 "setter" 的正确方法?
Correct way to have a "setter" in Scala?
如果在 Java class 成员的 setter 中有一些逻辑或数据清理,那么正确且普遍同意的相同方法是什么对于 Scala 案例-class?
断言?实现自己的应用方法?
一种选择是使用 def
或 lazy val
来获取转换后的值。例如
case class PostalCode(value: String) {
lazy val clean: String = value.replaceAll(" ","").toUpperCase
}
另一种选择,如果您不想保留原始值,and/or 您希望抛出异常或因输入错误而失败:
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.parse
或 PostalCode.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.")
}
如果在 Java class 成员的 setter 中有一些逻辑或数据清理,那么正确且普遍同意的相同方法是什么对于 Scala 案例-class?
断言?实现自己的应用方法?
一种选择是使用 def
或 lazy val
来获取转换后的值。例如
case class PostalCode(value: String) {
lazy val clean: String = value.replaceAll(" ","").toUpperCase
}
另一种选择,如果您不想保留原始值,and/or 您希望抛出异常或因输入错误而失败:
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.parse
或 PostalCode.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.")
}