当Scala app与Java代码交互时,有时需要处理Java方法返回的null
。
这两种方式中哪一种更加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")))
答案 0 :(得分: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
应该是什么,所以你最好自己编写自己的方法。
答案 1 :(得分:0)
我更喜欢第一种解决方案,它比第二种解决方案更清晰。
它可以改进为Scala成语:
require(a != null, "Wrong param")
在这种情况下, Option
不合适,因为Option
通常是在返回值中设计的。例如,List.find(...): Option
。