使用贷款模式(Loan Pattern)时是否需做空值检查避免NPE?
在Scala的贷款模式实现中,添加空值检查是否必要?
先看你提供的两段代码:
原贷款模式实现:
def using[A <: {def close() : Unit}, B](param: A)(f: A => B): B = try { f(param) } finally { param.close() }
修改后(增加空值检查):
def using[A <: {def close() : Unit}, B](param: A)(f: A => B): B = try { f(param) } finally { if (param != null) param.close() }
这个修改的必要性,得结合你的实际使用场景来判断:
当存在传入null的可能时(比如与Java交互)
这个检查非常有必要。假设调用者不小心传入了null,try块里执行f(param)时大概率会先抛出NPE,但如果finally块直接调用param.close(),会再次抛出NPE——此时原异常会被抑制,最终抛出的是finally块的异常,这会给调试带来极大困扰,你会看不到最初触发问题的根源。添加空值检查后,就能避免这种情况,保留最初的异常信息,方便定位问题。当严格遵循Scala非空规范时
如果你能保证所有调用using的地方都传入非空的资源实例(比如用Option处理空值,或者团队代码风格彻底杜绝null),那这个检查看起来有点多余,但添加它也不会有任何副作用,算是一种防御性编程的小细节,能让代码更健壮,以防万一出现意外的null。
总的来说,我建议保留这个空值检查——毕竟在实际开发中,很难完全杜绝null的出现,尤其是跨语言交互场景下,多这一层检查能避免不少潜在的麻烦。
内容的提问来源于stack exchange,提问作者gorros
相关产品推荐
相关产品推荐

