【问题标题】:Scala Constructor/Method Parameter CheckingScala 构造函数/方法参数检查
【发布时间】:2015-08-07 18:16:41
【问题描述】:

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

例如,如果我有课

class Foo(String bar){
  require(StringUtils.isNotEmpty(bar), "bar can't be empty")
}

我有哪些替代检查栏的方法?我要像这样创建一个伴生对象吗

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

或者我应该使用 Option 代替吗?

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

【问题讨论】:

  • 我也很想知道这个
  • @eddiemundorapundo 这对方法有什么作用?对于我只会使用 apply 的课程,对吗?
  • 很抱歉删除了我的评论,自从我上次使用 Scala 以来,我还没有看到 Try/Success/Failure。 Try/Success/Failure 似乎就像是 Option 一样。在您的示例中,您必须将 getOrElse() 与 Foo() 结合使用才能获取 Foo 对象,或者您可以使用 Foo().flatMap(...) 直接对 Foo 对象执行某些操作并返回另一个尝试(可能来自您的方法)然后链接更多地图/过滤器/whatevers。
  • @eddiemundorapundo 没问题,映射对选项 iirc 仍然有效! :) 当我创建它时,我可以在一边处理它,但这似乎是额外的工作——这就是为什么我想知道使用requires 是否会更好。

标签: scala


【解决方案1】:

我认为伴生对象的 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))
        }
    }

要使用它,您可以使用从 Foo(bar) 获得的 Success 做一些事情:

    val hehe = Foo(bar).map(foo => foo.someString()).getOrElse('failed')

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

【讨论】:

  • 哎呀,意味着让它也返回一个新的 foo 对象。所以当我想创建一个新的 Foo 对象时,val hehe = Foo(bar) 如果我传入一个错误的变量会给我一个失败,否则会给我一个成功? someString() 是什么?
  • 对不起someString() 只是foo 可能有的一个示例方法。是的,当barnull Foo(bar) 将返回一个Failure,它是Try 的一个实例,它具有map() 之类的方法。当您在Failure 上使用诸如map() 之类的方法时,它将返回相同的Failure。所以你可以把它想象成一个管道,当管道的某些部分返回 Failure 时,管道的所有其他部分都会通过 Failure。无论您想在哪里处理管道中的故障,都可以将recover()recoverWith() 放在哪里。
猜你喜欢
  • 2013-09-08
  • 2013-03-16
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2021-01-08
  • 2016-02-19
相关资源
最近更新 更多