Scala案例类:如何验证构造函数的参数

18

下面是一个案例类(Case Class),用于验证name参数既不是null也不为空:

case class MyClass(name: String) {

    require(Option(name).map(!_.isEmpty) == Option(true), "name is null or empty")
}

正如预期的那样,将null或空字符串传递给name会导致IllegalArgumentException异常。

是否有可能重写验证程序,以获取SuccessFailure而不是抛出IllegalArgumentException异常?

1个回答

24

构造函数不能返回除类类型之外的任何东西。但是,您可以在伴生对象上定义一个函数来完成这个任务:

case class MyClass private(name: String)

object MyClass {  
  def fromName(name: String): Option[MyClass] = {
    if(name == null || name.isEmpty)
      None
    else 
      Some(new MyClass(name))
  }

如果您愿意,当然可以返回ValidationEitherTry


我正在处理同一个领域,验证Case类参数。 我刚在StackOverflow的姐妹网站CodeReview上发布了一些关于它的内容。如果你有时间查看它,我将非常感激您对它的任何反馈意见;例如帮助减少样板代码、更好的方法来解决问题空间等等:http://codereview.stackexchange.com/questions/60645/reducing-boilerplate-when-validating-parameters-and-using-a-tuple-for-the-parame - chaotic3quilibrium
4
这样做的缺点是,如果有人调用案例类的复制方法,该对象可能会变为无效状态。 - shinyhappydan
如果不是有效的,那么“None”不会解释为什么。 - ses
1
根据我的最后一行“当然,如果你愿意,可以返回一个Validation、Either或Try。” 这些类型中的任何一个都可以用来提供有关失败的更多信息。 - vptheron
@DanGordon - 很好的观点。我有点困惑,因为我几乎可以确定在我写这个回复的时候编译器允许你这样做。伴生对象中的apply覆盖了由案例类自动生成的一个。虽然我可能错了。无论如何,我已经更改了对象中函数的名称。感谢您提出这个问题。 - vptheron
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接