0

当 Scala 应用程序与 Java 代码交互时,它有时需要处理null由 Java 方法返回的。

这两种方式中哪一种更符合scala的习惯?我应该使用哪一个?

1.

val a = javaClass.javaMethod
if (a == null) 
  throw new IllegalArgumentException("Wrong param")
processA(a)

2.

val a = Option(javaClass.javaMethod)
processA(a.getOrElse(throw new IllegalArgumentException("Wrong param")))
4

2 回答 2

3

如果推迟决定要做什么是一个优势null,那么您应该使用该Option表格,因为它迫使您稍后再处理它(即您不能忘记)。

否则,如果你无论如何都要抛出异常,你应该尽可能快地做到这一点,不要引入任何多余的变量。if如果你还是要写的话,使用语句是一个很好的方法a。如果没有,您可能需要编写一个辅助扩展方法:

implicit class ThrowExceptionOnNull[A](private val underlying: A) extends AnyVal {
  def throwIfNull(msg: String = "Wrong param") = {
    if (underlying == null) throw new IllegalArgumentException(s)
    underlying
  }
}

那么您的代码甚至不需要临时a变量:

processA(javaClass.javaMethod.throwIfNull)

并且方法名称对于正在阅读代码的人来说是一个很好的警告,如果它为空会发生什么。

Option(javaClass.javaMethod).get也会抛出异常并且是内置的,但它不优雅。这不是Option应该的,所以你最好编写自己的方法。

于 2015-04-13T22:37:19.247 回答
0

我更喜欢第一种解决方案,它比第二种更清晰。

它可以细化为 Scala 习语:

require(a != null, "Wrong param")

Option在这种情况下是不合适的,因为Option通常设计为返回值。例如,List.find(...): Option

于 2015-04-14T02:03:48.600 回答