Extended Collections Frameworkなるものを
GitHubにて公開しています。
もっと使いやすいCollectionsが欲しかったので壮大な(そうでもないかも)一人プロジェクトで作っていました。
現在はjavassistを用いた方法を考えているので放置中。
以下その説明。
githubにあげたReadMeほぼそのまま。
Extended Collections Framework概要
Java Collections Frameworkを拡張したフレームワークを目指している。
主に以下の3つのコレクションを目指している。
- Java Collections Frameworkにメソッドを追加したコレクション:collections with utilities(ucollection)
- 関数型のようなコレクション:functional collections(fcollection)
- 動的に内部動作を最適化するコレクション:dynamic collections(dcollection)
個人で使うために設計、実装しているためJavaの流儀や考え方には反している部分もある。
Objective-C, Scala, Xtend, haskellなどの影響を受けている。
いるかどうかはわからないが複数人で利用する場合は劇薬になる場合があるかもしれないので要注意。
またJavaにてインターフェースを拡張する場合のコンセプトコードでもある。
ucollectionの実装はほぼ完成(現状ではjava.util以下のクラスのみ)。
ただし、テストとテストコード, JavaDocが未完成。
他はまだまだ実験段階。
利用方法
NetBeansプロジェクト形式で配布されるのでNetBeansでビルドしてください。
またはNetBenasのプロジェクト形式なのでantでもビルド可能。
ライセンス
修正BSDライセンス。
ucollectionについて
ucollectionの設計目標
- 各インターフェースを拡張し、よく使うメソッドを呼べるようにする。
- 各インターフェース、各実装クラスはJava Collections Frameworkと互換性を持たせる。
- 各インターフェース、各実装クラスはJava Collections Frameworkと共存可能。
- 各インターフェース、各実装クラスはJava Collections Frameworkの対応クラスと容易に入れ替え可能
- 短い名前を用意する。
現状の実装ではjava.util.Collectionsなどのユーティリティクラスを統合している。
guavaに依存。
ucollectionの使い方
Java Collections Frameworkと共存性を持たせるためにパッケージが4つに分かれている。
それぞれのパッケージは以下。
- yuu.akron.ucollection:拡張実装クラスと短縮名クラス群
- yuu.akron.ucollection.another:java.util下のクラスと同名のクラス群
- yuu.akron.ucollection.interfaces:拡張インターフェースと短縮インターフェース群
- yuu.akron.ucollection.interfaces.another:java.util下のインターフェースと同名のインターフェース群
共存させたい場合は.anotherで終わらないパッケージを、置き換えたい場合は.anotherで終わるパッケージをインポートする。
これはクラス名を同名にすることにより実現している(パッケージは異なる)。
例:共存する場合
例:入れ替える場合
拡張インターフェースはjava.util以下のインターフェースを継承している。
そのため拡張実装クラスはjava.utilのインターフェース型の変数にも代入可能。
拡張実装クラスはjava.util下のクラスを継承している(EnumSet以外)。
そのため、java.utilの実装クラス型の変数にも代入可能
拡張実装クラス、短縮名クラス、同名クラスは継承関係になっている。
java.utilクラス=>拡張実装クラス=>短縮名クラス=>同名クラス
左が親、右が子の関係である。
このような関係のため次のような結果になる。
ただし、3つのクラスは4つのインターフェース(java.util、拡張、短縮、同名)をすべて実装しているためにインターフェースを介した場合は同じように利用可能である。
4つの実装クラス(java.util、拡張、短縮、同名)は中身が同じならequalsメソッドでは等価になるように設計されている。
実装上はjava.utilのものと同じ。
スタティックファクトリーメソッドなどが追加されている。