Setの実装は、ほとんど中身が空っぽ

JavaHashSetアルゴリズムを確認しようとクラスの中身を見てびっくり。
HashSet は、処理のほとんどを HashMap へ委譲するだけという超簡単なアルゴリズムでした。


コンストラクタはこんな感じ。

public HashSet() {
    map = new HashMap<E,Object>();
}

メソッドの処理は?

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

引数を Key、PRESENT というダミーのオブジェクトを Value として、Map に要素を追加していました。
contains や iterator といったメソッドも、そのまま Map へ処理を委譲しているだけになっていました。

他の実装は?

他の TreeSetEnumSet も、対になる TreeMapEnumMap へ処理を委譲していました。
HashMap 同様に、どのクラスも中身はほとんど空っぽで、ソースの半分以上がAPIの記述になっていました*1

委譲のお手本

これは、委譲のいいお手本だと思います。
ここまで何もしていないクラスっていうのは、読んでいてすごく新鮮でした。


ちなみに、このような実装になっていることは、APIにさりげなく書いてありました*2

このクラスは、ハッシュテーブル (実際には HashMap のインスタンス) に連動し、Set インタフェースを実装します。

Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle

*1:MergeDoc で日本語化したもので確認

*2:何度も読んだはずなんですが、今日になるまで気づきませんでした・・・。