jakarta-commons走り書き

StringUtils.isNumeric(String)という、文字列が数値解析可能かどうかチェックしてくれるメソッドが用意されてるが、空文字列""を渡すとtrueが返ってくる。これはちゃんとJavaDocコメントに書いてあるんだけど、あやうく間違えるところだった。(←JSP使って画面まわりを作成してるんで、空文字列が頻繁に出てくる)




てかいまcommons-langパッケージながめてたら、NumberUtils.toInt()と全く同じメソッドを今日作ったことに気づいた・・・ご丁寧に引数1つバージョンと2つバージョンの両方・・・しかも引数名までまったく同じだし!氏にたくなるわ。調べ方が甘かったなぁ。
ためしにググってみたところ、
NumberUtils.toInt の検索結果 約 61 件中 1 - 10 件目 (0.24 秒)
でヒット数少なすぎ!使用頻度はメチャクチャ高いと思うんだが。



一応覚書↓
commons-langパッケージのNumberUtilsクラスのメソッド、toInt()

toInt(String) は、引数の文字列をint値に変換して返す。

Integer.parseInt() やnew Integer(String)と違うのは、数値解析に失敗した場合、0を返すことだ。NumberFormatExceptionがスローされることはない。

解析失敗時の戻り値が0で都合が悪ければ、toInt(String, int) を使えばよい。引数のint値を返してくれるようになる。



言うまでもなく、自力でInteger.parseIntの例外処理とデフォルト値設定処理を実装する必要がなくなるのがメリットだ。

で、ソースはどうなっているかというと実に明快。


public static int toInt(String str, int defaultValue) {
if(str == null) {
return defaultValue;
}
try {
return Integer.parseInt(str);
} catch (NumberFormatException nfe) {
return defaultValue;
}
}
おもいっきりtry/catchしてる。「例外オブジェクトの生成はコストが高い」といわれているけど、正規表現とか使って文字列解析してif分岐するのと、どのくらいパフォーマンスが違うんだろう?




補足:

toInt()以外にも、toFloat()やtoLong()も用意されているので安心だ。