Javalobby - The heart of the Java developer community

Googleが公開しているJavaライブラリのひとつにGoogle Collections Libraryがある。2009年12月30日(米国時間)にバージョン1.0になり、以後APIが互換性のない変更を受けることはないという宣言が発表された。0x1fff: 35 Google open-source projects that you probably don't knowでもGoogleプロジェクトのひとつとして紹介されている。

JavaにははじめからCollectionsライブラリが用意されている。Collectionsライブラリはまさまざまなデータを格納する便利な入れ物をまとめたもの。Google Collections LibraryはJavaの標準のCollectionライブラリを拡張し、さまざまな機能を提供することを目指している。Collectionsライブラリはプログラミングの生産性に直接関係してくるだけに、どの程度便利になるのかはプログラマの興味を引くポイントだ。

Google Collections Libraryを調査してみたという内容がReasons to Use Google Collections - Javalobbyにおいて簡潔に紹介されている。実際のサンプルコードも掲載されており、その違いがわかりやすい。Reasons to Use Google Collectionsでは特にMultimapが便利だとし、個人と電話データをCollections APIを使って操作する場合の例をあげて違いを示している。

まず、1個人に対して0以上の複数の電話データを関連付けることができると定義。JavaのデフォルトのCollections APIであれば、Map (HashMap)を電話帳に割り当てて、そこに個人を表現するオブジェクトと、電話データを表現するオブジェクトを格納したList (ArrayList)を格納する。この場合、Listを生成する処理と、リストを取り出して次の電話オブジェクトを追加する処理が必要になる。Java Collections APIを使うケースではよく見かけるソースコードだ (Reasons to Use Google Collectionsより抜粋)。

Map<Person, List<PhoneNumber>> phoneBook =
    new HashMap<Person, List<PhoneNumber>>();


Person me = new Person("James");


if (phoneBook.get(me) == null) {
    phoneBook.put(me, new ArrayList<PhoneNumber>());
}
phoneBook.get(me).add(new PhoneNumber(111));

Google Collections LibraryのMultimapは、ひとつのキーに対して複数のオブジェクトを関連付けることができるように拡張されたCollections API。先ほどのコードをMultimapを使うようにすると次のようになるという (Reasons to Use Google Collectionsより抜粋)。

Multimap <Person, PhoneNumber> newPhoneBook =
   ArrayListMultimap.create();


Person me = new Person("James");
newPhoneBook.put(me, new PhoneNumber(111));
newPhoneBook.put(me, new PhoneNumber(201));

細かい処理はAPIの内部で処理されるため、コード自身がよりすっきりしている。もちろん、ラッパクラスを用意すれば同じことは実現できる。Google Collections Libraryを採用する利点は、こうした便利なCollections APIがすでに開発されてまとまっていること、1.0になってAPIがフィックスし今後互換性を失う変更がおこなわれることがない、といったあたりにある。また、便利なCollections APIのアイディアとしても参考になる。