3

Scala から Java を扱う場合、null を考慮する必要があります。

たとえば、HttpServletRequest ゲッター (getAttribute、getHeader など) はすべて null を返す可能性があります。

HttpServletRequest メソッドを呼び出すたびに手動で case/match または map 操作を実行できることはわかっていますが、それは少し面倒です。また、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) 同じ/類似の効果を達成するために、enrich-my-library 以外の別の/より良い方法はありますか?
2)これが「その」方法である場合、パフォーマンスへの影響/リスクは何ですか?言い換えれば、このパターンの明白な有用性/利便性にやけどをすることはありますか?

これが明らかな場合は申し訳ありませんが、先日強化を開始したばかりで、非常に便利なようです。適切なシナリオでパターンを適用していることを確認したいだけです...

EDIT
@dhg は、 Option.apply() と次のことを指摘しました。

def safe[T](v: T) = v match {
  case null => None
  case x => Some(x)
}

同等であるため、getter メソッドは無関係な safe(f()) ラッパーの代わりに Option(f()) を使用するようになりました

ありがとう

4

1 に答える 1

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()ますnull

暗黙の変換も問題ありません。ただし、クラス名にはアンダースコアを使用しないでください。Java/Scalaの命名規則ではCamelCase

于 2012-04-06T19:44:19.337 に答える