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

j3d*_*j3d 16 scala

下面是一个案例类,用于验证name参数既不null是空的也不是空的:

case class MyClass(name: String) {

    require(Option(name).map(!_.isEmpty) == Option(true), "name is null or empty")
}
Run Code Online (Sandbox Code Playgroud)

正如所料,传递null或空字符串name导致IllegalArgumentException.

是否有可能重写验证以获得SuccessFailure代替抛出IllegalArgumentException

vpt*_*ron 21

您不能让构造函数返回除类类型之外的其他内容.但是,您可以在随播对象上定义一个函数来执行此操作:

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))
  }
Run Code Online (Sandbox Code Playgroud)

当然Validation,如果您愿意,您可以返回a ,an Either或a Try.

  • 这样做的缺点是,对象可能会被调用case类的copy方法的人变为无效状态 (3认同)