Scala构造函数/方法参数检查

jst*_*hng 7 scala

我想检查一些Scala编程的最佳实践,因为我是Scala的新手.我在网上读到了Scala除了"特殊"情况(不包括参数检查)之外通常不会使用异常的情况.现在在我的项目中我使用了很多require,所以我想知道更好的类型检查方法是什么.

例如,如果我有一个班级

class Foo(String bar){
  require(StringUtils.isNotEmpty(bar), "bar can't be empty")
}
Run Code Online (Sandbox Code Playgroud)

检查吧我有什么其他选择?我是否像这样创建一个伴侣对象

Object Foo {
  def apply(bar: String) = Try[Foo] {
    bar match = {
      case null => Failure("can't be null")
      //rest of checks
      case _ => Success[Foo]
  }
}
Run Code Online (Sandbox Code Playgroud)

或者我应该使用Option吗?

另外,对于scala方法,如何检查方法的参数?如果我已经返回一个Option,如果我得到一个错误的参数,我是否只返回一个空选项?这是不是意味着当我使用方法的返回时我必须检查一个空选项,并且不会抛出异常允许更具体的消息?(例如,运行时异常不能使用空值).

edd*_*ndo 2

我认为你的伴生对象的 Success 部分也会返回 Foo() 对象?

    Object Foo {
      def apply(bar: String) = Try[Foo] {
        bar match = {
          case null => Failure("can't be null")
          //rest of checks
          case _ => Success[Foo](new Foo(bar))
        }
    }
Run Code Online (Sandbox Code Playgroud)

Success要使用它,您可以对从 Foo(bar) 获得的内容执行一些操作:

    val hehe = Foo(bar).map(foo => foo.someString()).getOrElse('failed')
Run Code Online (Sandbox Code Playgroud)

Try 方法将自动将 someString() 生成的异常或您在 Failures 中执行的其他操作所生成的异常包装起来。如果您想检查 的参数foo.someString(),您可以执行与您的apply()方法类似的操作。这与在条件下抛出异常没有太大区别,但我认为它更好,因为“catch 块”将位于recover()or中recoverWith()。如果您的代码未设计为从上到下链接,您始终可以退出Tryusing 。getOrElse()Try