GoogleのJavaコレクションを使う理由、Multimapが便利
2010/01/07
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のアイディアとしても参考になる。
関連サイト
ヘッドライン
- IPA、OSS情報データベース「OSS iPedia」を刷新[18:55 3/19]プログラミング
- 東北大、鉄系高温超伝導体におけるディラック電子的振る舞いの観測に成功[18:05 3/19]エレクトロニクス
- 東芝、新潟県柏崎市で新型2次電池量産工場の建設を開始[17:58 3/19]エレクトロニクス
- Symbian、GCCでコンパイラ対応プロジェクト「Software Freedom Fighters」[17:49 3/19]プログラミング
- 伊藤忠商事、戸田工業と共同で北米にリチウムイオン電池正極材工場を建設[17:27 3/19]エレクトロニクス
- 昭和電工、樹脂複合材用カーボンナノチューブの量産を開始[17:04 3/19]エレクトロニクス
- 東北大、巨大超弾性歪みを有する高強度な鉄合金を開発[16:18 3/19]サイエンス
- STMicro、CryptoFirewallセキュリティ機能内蔵のSTB用SoCを開発[16:04 3/19]エレクトロニクス
- SEMI、2009年の半導体材料出荷額を発表 - 総額は前年比18.5%減の346億ドル[15:53 3/19]エレクトロニクス
- 住友大阪セメント、リチウムイオン電池向け高エネルギー密度の正極材を開発[15:37 3/19]エレクトロニクス






