我是否需要在贷款模式中检查是否为空

时间:2018-04-05 13:37:06

标签: scala

以下是贷款模式的一个常见示例:

def using[A <: {def close() : Unit}, B](param: A)(f: A => B): B =
   try {
       f(param)
   } finally {
       param.close()
   }

我需要照顾NPE并添加支票吗?

def using[A <: {def close() : Unit}, B](param: A)(f: A => B): B =
   try {
       f(param)
   } finally {
        if (param != null) param.close()
   }

2 个答案:

答案 0 :(得分:0)

如果将资源归零是合法使用API​​,请检查null。不要检查它只是因为技术上可能引用类型包含null,或者你将检查每隔一行代码为null。

答案 1 :(得分:-1)

这是单元测试(甚至可能是TDD)有用的地方。您应该测试每个可能的场景,并确保您的功能表现得如此。

在回答你的问题时 - 如果你认为他们可能被击中,那么对于边缘案件进行会计处理并没有错。但是,我认为如果null会在您的函数中引发异常,则应将其放在catch括号中,例如:

def using[A <: {def close() : Unit}, B](param: A)(f: A => B): B = {
  try {
    f(param)
    param.close()
  } catch {
    case e: RuntimeException => ???
    case e: NullPointerException => ???
    case e: Exception => ??? // do something with the exceptions
  }
}

这样,您可以根据需要处理异常。当然,您也可以随时添加finally括号,或者如果符合您的需要,将param.close()移回finally