选项化Java getter

时间:2012-04-06 19:37:39

标签: java scala null option enrich-my-library

使用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())包装器

由于

1 个答案:

答案 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