如何检查构造函数参数并在Scala中的默认构造函数中引发异常或断言?

如何检查构造函数参数并在Scala中的默认构造函数中引发异常或断言?,scala,exception,constructor,assert,Scala,Exception,Constructor,Assert,如果参数集无效(值不符合预期约束),我想检查构造函数参数并拒绝构造抛出IllegalArgumentException。如何在Scala中编写此代码?在Scala中,类的整个主体是您的主构造函数,因此您可以在其中添加验证逻辑 scala> class Foo(arg: Int) { | require (arg == 0) | } defined class Foo scala> new Foo(0) res24: Foo = Foo@61ecb73c s

如果参数集无效(值不符合预期约束),我想检查构造函数参数并拒绝构造抛出
IllegalArgumentException
。如何在Scala中编写此代码?

在Scala中,类的整个主体是您的主构造函数,因此您可以在其中添加验证逻辑

scala> class Foo(arg: Int) {
     |   require (arg == 0)
     | }
defined class Foo

scala> new Foo(0)
res24: Foo = Foo@61ecb73c

scala> new Foo(1)
java.lang.IllegalArgumentException: requirement failed
scala> class Foo(val i: Int) {
     |   if(i < 0) 
     |     throw new IllegalArgumentException("the number must be non-negative.")
     | }
defined class Foo

scala> new Foo(3)
res106: Foo = Foo@3bfdb2

scala> new Foo(-3)
java.lang.IllegalArgumentException: the number must be positive.
更好的方法可能是提供一个工厂方法,该方法提供一个
scalaz.Validation[String,Foo]
,而不是抛出异常。(注意:需要Scalaz)

scala>:粘贴
//进入粘贴模式(按ctrl-D键完成)
等级Foo专用(val i:Int)
对象Foo{
def应用(i:Int)={
if(i<0)
失败(“数字必须为非负。”)
其他的
成功(新富(一))
}
}
//正在退出粘贴模式,现在正在解释。
定义类Foo
定义模块Foo
scala>Foo(3)
res108:scalaz.Validation[java.lang.String,Foo]=成功(Foo@114b3d5)
scala>Foo(-3)
res109:scalaz.Validation[java.lang.String,Foo]=失败(数字必须为非负。)

不错!这是对这个问题的完美回答。您能否详细介绍一下
require
的工作原理(或链接到精化)?下面是
require
的工作原理,@dan burton;-)如果参数为false,它只会抛出新的IllegalArgumentException(“requirement failed”)。使用
require
而不是自己抛出异常的整个想法是为了让代码更漂亮,更适合静态分析(这似乎还没有实现)。在构造函数中抛出异常并不理想。每当我需要一个对其任何构造函数参数的域有限制的类型时,我都会将构造函数设置为私有的,并通过一个工厂强制实例化,该工厂应用约束并抛出(通常通过
require
)或返回
Try[ConstrainedType]
。我想你的意思是require中的消息应该是
非负的。
class Foo(val i: Int) {
  require(i >= 0, "the number must be non-negative.")
}
scala> :paste
// Entering paste mode (ctrl-D to finish)

class Foo private(val i: Int)

object Foo {
  def apply(i: Int) = {
    if(i < 0)
      failure("number must be non-negative.")
    else
      success(new Foo(i))
  }
}

// Exiting paste mode, now interpreting.

defined class Foo
defined module Foo

scala> Foo(3)
res108: scalaz.Validation[java.lang.String,Foo] = Success(Foo@114b3d5)

scala> Foo(-3)
res109: scalaz.Validation[java.lang.String,Foo] = Failure(number must be non-negative.)