一部の人々は「オプションのメソッド」を嫌うかもしれませんが、多くの場合、高度に分離されたインターフェースよりも優れたセマンティクスを提供します。とりわけ、オブジェクトは、その存続期間中に能力や特性を獲得したり、オブジェクト(特にラッパーオブジェクト)がどの正確な能力を報告すべきかをいつ構築するかを知らなかったりする可能性を考慮します。
優れたデザインのJavaコレクションクラスのパラゴンを呼び出すことはほとんどありませんが、優れたコレクションフレームワークには、その特性と能力についてコレクションに問い合わせる方法と共に、多数のオプションメソッドを基盤に含めることをお勧めします。このような設計により、基になるコレクションが持つ可能性のある機能を誤って不明瞭にすることなく、単一のラッパークラスをさまざまなコレクションで使用できます。メソッドがオプションではない場合、コレクションがサポートする機能の組み合わせごとに異なるラッパークラスを用意するか、状況によっては使用できないラッパーを用意する必要があります。
たとえば、コレクションがインデックスによるアイテムの書き込みまたは末尾へのアイテムの追加をサポートするが、アイテムの中央への挿入をサポートしない場合、実行されるすべてのアクションをログに記録するラッパーにそれをカプセル化するコードにはバージョンが必要ですサポートされている機能の正確な組み合わせを提供するロギングラッパーの場合、または利用できない場合は、appendまたはwrite-by-indexのいずれかをサポートし、両方はサポートしないラッパーを使用する必要があります。ただし、統合コレクションインターフェイスが3つのメソッドをすべて「オプション」として提供し、どのオプションメソッドが使用可能かを示すメソッドを含めると、単一のラッパークラスが機能の任意の組み合わせを実装するコレクションを処理できます。どの機能をサポートしているのかを尋ねられると、ラッパーはカプセル化されたコレクションがサポートしているものを単に報告できます。
「オプションの機能」の存在により、集約されたコレクションが、機能が実装の存在によって定義された場合よりもはるかに効率的な方法で特定の機能を実装できる場合があります。たとえば、concatenate
メソッドを使用して他の2つの複合コレクションを形成するとします。最初のコレクションはたまたま1,000,000個の要素を持つArrayListであり、最後のコレクションは最初から反復できる20個の要素のコレクションでした。複合コレクションが1,000,013番目の要素(インデックス1,000,012)を要求された場合、ArrayListに含まれるアイテムの数(つまり1,000,000)を要求し、要求されたインデックスからそれを減算し(12を取得)、2番目から12の要素を読み取り、スキップできますコレクション、および次の要素を返します。
このような状況では、複合コレクションにはインデックスによってアイテムを瞬時に返す方法はありませんが、複合コレクションに1,000,013番目のアイテムを要求する方が、個々のアイテムから1,000,013個のアイテムを読み取り、最後を除くすべてを無視するよりもはるかに高速です1。