使用Scala中的Java时,我们必须考虑null。
例如,HttpServletRequest getters(getAttribute,getHeader等)都可能返回null。
我知道我可以在每次调用HttpServletRequest方法时手动执行大小写/匹配或映射操作,但这有点单调乏味。此外,像request.getHeader(“Accept-Encoding”)这样的方法调用是满口的。
我想出了一个能够解决这两个问题的方法:
class Servlet_Request_Provides_NullSafe_Getters (r: HttpServletRequest) {
def header(s: String) = Option( r.getHeader(s) )
def attrib(s: String) = Option( r.getAttribute(s) )
def remoteHost = Option( r.getRemoteHost )
def accepts = header("Accept-Encoding")
}
implicit def request2Option(r: HttpServletRequest) =
new Servlet_Request_Provides_NullSafe_Getters(r)
1)是否有另一种/更好的方式来富集我的图书馆来实现相同/类似的影响?
2)如果这是“走向”的方式,那么性能影响/风险是什么?换句话说,这个模式的明显实用性/便利性是否可以焚烧?
对不起,如果这个东西很明显,那么前几天才开始丰富,而且看起来非常有用。只是想确保我在适当的场景中应用模式......
修改
@dhg指出Option.apply()和:
def safe[T](v: T) = v match {
case null => None
case x => Some(x)
}
是等价的,所以getter方法现在使用Option(f())而不是我的无关安全(f())包装器
由于
答案 0 :(得分:4)
正如评论中已经提到的那样:
def safe[T](v: T) = Option(v)
Option(v)
相当于:
v match {
case null => None
case x => Some(x)
}
safe
方法也是不必要的公开和类的一部分。我建议简单地将其内联。
2)如果这是“走向”的方式,那么性能影响/风险是什么?
通常,调整Java遗留API以利用Option
是一个好主意。我经常使用可以返回EntityManager.find()
的{{1}}执行此操作。
你的隐式转换也没关系。但是,不要在类名中使用下划线,Java / Scala命名约定更喜欢null
。