この記事の目的
ライブラリのコードが読めると、ライブラリを早く使いこなせるようになります。本記事ではApache Commons Langを例にとって、ライブラリのコードの読み方の基本を紹介します。
ライブラリのコードを読むときのポイント
下記2つのポイントがあります。
- Javaクラスライブラリを理解する
- 行数の長いコードはブロックに分けて考える
Javaクラスライブラリを理解する
「Javaクラスライブラリ」とは、Javaをインストールしたその時点から使えるライブラリです。
Javaでプログラミングする上での基礎であるため、世の中にあるJavaライブラリはJavaクラスライブラリを利用して書かれています。そのためJavaクラスライブラリへの理解が不可欠です。
しかし、Javaクラスライブラリは膨大なため、最初に全てを覚えるのは得策ではありません。
自分の知らないJavaクラスライブラリが出てきた時点で、都度都度調べるスタンスが良いです。
行数の長いコードはブロックに分けて考える
行数の長いコードを1度に理解しようとすると理解が追い付かなくなります。
その場合はコードをいくつかのブロックに分けて、ブロック内を1つずつ理解していくようにします。最後に各ブロック内で行っていることをまとめれば、全体で行っていることが分かります。
具体例を挙げて紹介
StringUtils#isEmpty(CharSequence cs)
引数CharSequence csがnullまたは長さが0の場合にtrueを返すメソッドです。
CharSequenceインターフェースはあまり聞き慣れないかもしれませんが、Stringクラスが実装しているインターフェースです。つまり、本メソッドはStringクラスの変数を引数にして呼び出せます。
public static boolean isEmpty(final CharSequence cs) { return cs == null || cs.length() == 0; }
わざわざライブラリを使って呼び出すほどのメソッドとは思えないかもしれません。しかし、実際には下記のメリットがあります。
- ORの論理演算子(縦棒2つ)が見かけ上なくなるため、コードの見た目がすっきりする
- 使う機会が多くタイピングミスする可能性があるが、ライブラリを使えばバグを防止できる
ArraySorter#sort(final int[] array)
引数int[] arrayをソートして返すメソッドです。同名で引数が異なるメソッドも一通り用意されています(byte[]、float[]、…)。
public static int[] sort(final int[] array) { Arrays.sort(array); return array; }
JavaクラスライブラリのArrays#sort(int[] a)は返り値がなく、引数のint[] aをソートされた状態に変えるメソッドです。
しかし、メソッドの返り値としてソートされた配列が返るほうがメソッドの動作として直感的です。ArraySorter#sort(final int[] array)は一工夫して直感的な動作にしてくれています。
ArrayUtils#toPrimitive(final Integer[] array)
引数Integer[] arrayをint配列に変換して返すメソッドです。同名で引数が異なるメソッドも一通り用意されています(Byte[]、Long[]、…)。
たまに使いたくなる処理で、ライブラリにあると重宝します。
public static int[] toPrimitive(final Integer[] array) { if (array == null) { return null; } else if (array.length == 0) { return EMPTY_INT_ARRAY; } final int[] result = new int[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].intValue(); } return result; }
少し長いメソッドなので2つのブロックに分けて理解していきましょう。
1ブロック目 (2行目~6行目)
if (array == null) { return null; } else if (array.length == 0) { return EMPTY_INT_ARRAY; }
このブロックは引数arrayがnullや長さ0かをチェックし、該当する場合にすぐに結果を返します。引数arrayがnullのときはnullを返し、引数arrayの長さが0のときはEMPTY_INT_ARRAYを返します。
2ブロック目 (7行目~11行目)
final int[] result = new int[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].intValue(); } return result;
引数arrayがnullでなく長さが1以上の場合は、2ブロック目で結果を返します。
まず返り値として返すためのint[] resultを定義します。
次に引数arrayの各要素(Integer)を、JavaクラスライブラリInteger#intValueでintに変換してint[] resultの各要素に格納します。
最後に格納が終わったint[] resultを返します。
コメント