RIAトピックス
リッチクライアント/RIAを主テーマに取り扱います。Flex、Ajax、AIR、Silverlight、JavaFX、etc。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

commons-langのお気に入りメソッド15選
JavaのAPIには、プログラミングを行う上で必要な多くの機能が搭載されていますが、Rubyのような大クラス主義の言語と比較すると多少機能に物足りなさを感じたり、かゆいところに手が届かなかったりする部分があることに気付きます。
独自に作成するのは難しくなくても、必要になったときに毎回実装、テストするのは面倒です。
汎用的に必要になる機能はライブラリとしてまとめてあったほうが便利ですよね。

Apache commons-langは、java.langパッケージを補完する、細かいところで意外に便利な様々な機能を提供してくれます。
地味ながらもプロジェクトを影から支えてくれて、プログラマに安心を与えてくれます。
そんなcommons-langの中から私のお気に入りの機能を紹介します。

◆StringUtils.isEmpty()、isNotEmpty()


文字列がnullまたは空かどうかを判定します。
独自実装が不要なものの代名詞ですね。
Java6からは組み込みのStringクラスにisEmpty()が追加されましたが、インスタンスメソッドなのでnull判定できません(NullPointerException)。

◆StringEscapeUtils.escapeXxx()


特殊文字のエスケープ作業を自動的に行うものです。
たとえば「<」や「>」は、HTMLやXMLではタグの開始・終了を表す特殊文字であり、これらの文字を特殊文字ではなく単に文字として扱いたい場合、「&lt;」「&gt;」のようにエスケープする必要があります。

@Test
public void testEscapeHtml() {
String result = StringUtils.escapeHtml("<span>");
assertEquals("&lt;span&gt;", result);
}

フォーマットとしては、CSV、HTML、Java、JavaScript、SQL、XMLの形式に対応したメソッドがあります。

◆StringUtils.isNumeric()


文字列が0~9の数字だけで構成されているかを判定するメソッドです。
「-」(マイナス記号)、「.」(少数点)、「d」(double型を表すサフィックス)などはNGになります。

◆StringUtils.abbreviate()


文字列が指定のサイズを超えている場合、短縮して末尾に「...」を付加します。

@Test
public void testAbbreviate() {
String str = "Do not pray for easy lives. Pray to be stronger men. John F. Kennedy";
String result = StringUtils.abbreviate(str, 35);
assertEquals("Do not pray for easy lives. Pray...", result);
}

TLDファイルに登録してJSPからELファンクションとして使うのもアリですね。

◆StringUtils.join()


配列やCollectionの各要素を連結した文字列を生成して返します。
CSVのレコードを作成するときなどに便利。

@Test
public void testJoin() {
String[] values = new String[] {"a", "b", "c", "d", "e" };
String result = StringUtils.join(values, ",");
assertEquals("a,b,c,d,e", result);
}


◆StringUtils.substringAfter()、substrigBefore()、substringBetween()


文字列から、指定した文字列より前(, 後 or 中間)の文字列を抽出します。
String#substring()と違って、String#indexOf()やString#lastIndexOf()でインデックス位置を求めなくて済むため、可読性が高くミスも減ります。

@Test
public void testSubstringXxx() {
String target = "abcdefg";
assertEquals("abc", StringUtils.substringBefore(target, "d"));
assertEquals("fg", StringUtils.substringAfter(target, "e"));
assertEquals("de", StringUtils.substringBetween(target, "c", "f"));
}


◆ArrayUtils.contains()


ある値が配列に含まれているかを調べるメソッド。
ループで回してひとつひとつ調べたり、ソートしてArrays.binarySearch()するより楽です。

@Test
public void testContains() {
String[] ary = new String[]{
"ヨウイチ", "ノブヒコ", "ヒロアキ", "セイジ", "マサオ"
};
assertTrue(ArrayUtils.contains(ary, "セイジ"));
assertFalse(ArrayUtils.contains(ary, "キョウイチ"));
}


◆SerializationUtils.serialize()、deserialize()


オブジェクトをシリアライズ、デシリアライズする際に使います。
私はよく、障害発生時の状況を手っ取り早くTestCase上で再現したいときに使ったりしますね。

◆ToStringBuilder.reflectionToString()、ReflectionToStringBuilder.toString()


toString()メソッドをいちいち実装するのが面倒なときに使います。
基底のバリューオブジェクトにこのライブラリを使ってtoString()メソッドを実装しておき、各VOではオーバーライドしないようにします。リフレクションにより実際の型に応じた出力内容が返されます。とってもDRYですね!

@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}


◆NumberUtils.isNumber()


文字列が数値に変換可能な場合、trueを返します。
StringUtils.isNumeric()は「-」「.」「d」などが含まれているとfalseが返りますが、こちらはtrueが返ります。

◆DateFormatUtils.format()


DateオブジェクトやCalendarオブジェクトを日付フォーマットに従い、文字列に変換します。
内部的にFastDateFormatというクラスを使っているため、SimpleDateFormatよりも高速で、なおかつスレッドセーフです。
DateだけでなくCalendarを扱うこともできます。

◆DateUtils.addXxx()


Dateオブジェクトに日数や時間を加算・減算します。
Calendarにいちいち変換するのが面倒なときに。

◆DateUtils.isSameDay()


DateオブジェクトやCalendarオブジェクトが同じ日付を表すかを判定します。
Date#equals()はミリ秒単位でしっかり合っていないとfalseが返りますし、Calendar#equals()は同じ日付であってもlenient(非厳密モード)が異なったりするとfalseが返ります。
なので同じ日付かを判定する処理を自作しようと思ったら意外と面倒だったりしますね。

◆DateUtils.truncate()


DateオブジェクトやCalendarオブジェクトから、指定したフィールド以降の値をクリアします。

@Test
public void testTruncate() {
Date date = DateUtils.truncate(new Date(), Calendar.DATE);
assertEquals("2009/03/22 00:00:00.000", DateFormatUtils.format(date, "yyyy/MM/dd HH:mm:ss.SSS"));
}


◆StopWatch#start()、stop()、getTime()


start()が呼ばれてからstop()が呼ばれるまでの時間を計測します。
開始と終了でSystem.currentTimeMillis()を使って計算しなくても済みます。
計測を終えた後、getTime()でミリ秒単位の計測結果を、toString()でHH:mm:ss.SSSフォーマットの計測結果を取得できる。
パフォーマンス測定用のインターセプタを作るのに使ったりします。

セイジ
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

copyright © 2005 RIAトピックス all rights reserved.
Powered by FC2ブログ.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。