「Commons Lang」とは

「Commons Lang」は、Apache commonsのライブラリ。

JavaSE標準ライブラリにおいて
不便であったりで足りない機能を補うクラスが
数多く提供されている。

例えば、Dateクラスは標準ライブラリに存在するが使いにくい。
というように標準ライブラリのjava.lang周りを補完するものを提供する。

このようなライブラリでほかの有名どころにGuavaがある。
どちらを使うか考えるかも知れないが両方使える。

Guavaとも同じようなクラスも存在はするが被っていない機能も多い。
共に副作用の強いクラスはほとんど無いので、両方ライブラリとして追加してもよい。

また、「Commons Lnag」は便利なライブラリといった側面のほかにも
ユーティリティ(ライブラリ)の設計として見てみると
おもしろく、参考になる。

こういったユーティリティはついなんとなく作ってしまいがちだが、
「Commons Lnag」には真似したい(取り入れたい)考えが多い。

「nullセーフ」であったり、
「JavaDocの書き方」であったり、
「内部キャッシュ」であったり
勉強になる。

扱っている機能自体がそこまで難関なものではないので
解析がしやすい。(もちろんオープンソース)

便利として使う以外にも、こういったところも参考にしたい。

このクラスだけでも使いたいクラス

Commons Langの中でも特徴的で、このクラスを使いたいがために
Commons Langをライブラリに組み込みたいと思えるクラスをいくつか紹介する。

StringUtils

StringUtilsはStringに関するユーティリティメソッドを提供する。
それは全てnullセーフになっている。

文字列操作に関するメソッドを使うとき
Stringがnullの場合、即例外になってしまう。

すぐに例外になっても困ることが多いし、
nullチェックを入れるとコードが見にくくなるので
StringUtilsは重宝する。

nullセーフであることはStringUtilsだけでなく
Commons Lang内の他ユーティリティでも
採用されている思想である。

Stringクラスを用いたトリム
String trimedStr;
if (str != null) {
  trimedStr = str.trim();
} else {
  trimedStr = null;
}
StringUtilsを用いたトリム
String trimedStr = StringUtils.trim(str);

またStringUtilsは提供するメソッドが
とても豊富でざっと25種類180個以上もある。
(バージョン3.3.2現在)

例えば、subStringだけでもこれだけある。

substring関係のメソッド
substring(String str, int start)
substring(String str, int start, int end)
substringAfter(String str, String separator)
substringAfterLast(String str, String separator)
substringBefore(String str, String separator)
substringBeforeLast(String str, String separator)
substringBetween(String str, String tag)
substringBetween(String str, String open, String close)
substringsBetween(String str, String open, String close)

とにかく数も種類も多いので、
文字列関連のユーティリティを探すとたいてい見つけることができる。

FastDateFormat(Commons Lang API)

ContextedRuntimeException

ContextedRuntimeExceptionは
例外オブジェクトに情報を追加できる機能をもったクラス。

例外を発生させる場合に、
1つの文字列の中にすべての情報を入れるのは難しい。

なので簡単なメッセージを付け加えるだけしかできず
大切な例外時の状況を伝えることができない。

そこでContextedRuntimeExceptionは
ラベルと値というかたちで、
いくつでもそのときの状況を付加することができるのでわかりやすい。

int employId = 1;
String name = "Taro";
int baseSalary = 300000;
 
try {
    // 何らかの処理
} catch (Exception e) {
    throw new ContextedRuntimeException("給与計算中に例外が発生。", e)
        .addContextValue("従業員ID", employId)
        .addContextValue("名前", name)
        .addContextValue("基本給", baseSalary);
}

独自例外を作成する場合も
ただRuntimeExceptionを継承するのではなく
ContextedRuntimeExceptionを継承しておけば
こんな機能が簡単に利用できる。

ContextedRuntimeException(Commons Lang API)

DateUtils

Date型の日付計算やCalendar型との変換など面倒なことが多い。
DateUtilsはそのいくつかを補うことができる。

通常のDate型の日付計算
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.YEAR,1);
DateUtilsを用いた日付計算
Date date = new Date();
DateUtils.addYears(date, 1);

JavaSE8からDateTime APIが登場しているが
Date型はおそらくまだまだ現役だろう。

そういったときに、DateUtilsのメソッドはありがたい。

DateUtils(Commons Lang API)