Collection
Java ライブラリで、インターフェースが拡張されずインターフェースCloneable
されない理由は何Serializable
ですか?
2 に答える
Collection
elementsと呼ばれるオブジェクトのグループを指定するインターフェイスです。要素のグループを維持する方法の詳細は、 の具体的な実装に任されていCollection
ます。たとえば、一部のCollection
実装でList
は要素の重複を許可しますが、他の実装では許可Set
しません。多くのCollection
実装には publicclone
メソッドがあります。ただし、 のすべての実装にこれを含めることはあまり意味がありませんCollection
。Collection
は抽象表現だからです。重要なのは実装です。実際の実装; つまり、具体的な実装では、クローンまたはシリアル化する方法、またはクローンまたはシリアル化できるかどうかを決定する必要があります。場合によっては、実際のバッキング実装が何であるかによって、クローン作成とシリアライゼーションがあまり意味をなさないことがあります。したがって、すべての実装でクローン作成とシリアル化を義務付けることは、実際には柔軟性が低く、より制限的です。特定の実装では、複製またはシリアル化できるかどうかを決定する必要があります。
Oracleのドキュメントからの説明は次のとおりです。
多くの Collection 実装 (JDK によって提供されるすべてのものを含む) には public clone メソッドがありますが、すべての Collection でそれを要求するのは間違いです。たとえば、テラバイトの SQL データベースに支えられたコレクションのクローンを作成するとはどういう意味でしょうか? メソッド呼び出しにより、会社は新しいディスク ファームを要求する必要がありますか? シリアライズ可能についても同様の議論が成り立ちます。
クライアントがコレクションの実際のタイプを知らない場合、必要なコレクションのタイプをクライアントに決定させ、このタイプの空のコレクションを作成し、addAll メソッドを使用してコレクションをコピーする方が、はるかに柔軟でエラーが発生しにくくなります。元のコレクションの要素を新しいコレクションに。
もしそうなら、それはすべてのCollection
実装がCloneable
andSerializable
である必要があり、必要以上に制限されているからです. 実装ではこれらのインターフェイスも実装されることがよくありますが、Collection
インターフェイスがそれを必要とするわけではありません。