私はEffective Javaを読んでいますが、本にはcloneメソッドに関する以下のコメントがあります。
実際には、Cloneable を実装するクラスは、適切に機能する public clone メソッドを提供することが期待されます。一般に、クラスのすべてのスーパークラスが、パブリックかプロテクトかにかかわらず、正常に動作するクローン実装を提供しない限り、これを行うことはできません。
これができない理由の例を誰か挙げることができますか?
私はEffective Javaを読んでいますが、本にはcloneメソッドに関する以下のコメントがあります。
実際には、Cloneable を実装するクラスは、適切に機能する public clone メソッドを提供することが期待されます。一般に、クラスのすべてのスーパークラスが、パブリックかプロテクトかにかかわらず、正常に動作するクローン実装を提供しない限り、これを行うことはできません。
これができない理由の例を誰か挙げることができますか?
基本クラスの 1 つに、「クローン」が意味的に有効になるように特定の方法でコピーされるプライベート フィールドがあるとします。
その基本クラスが正しいクローン実装を提供しない場合、派生クラスもできません。そのプライベート フィールドを正しく構築する方法がありません。
基本的に、クラス階層の一部に、自分の管理下になく、JDK の一部ではないクラス (つまり、サードパーティのクローズドソース クラス) が含まれており、このクラスが行儀の良いclone()
メソッドを実装していない場合、それは正しくありません。特に簡単に作成できます。
`@override
public MyClass clone(){
Myclass clonedObj = super.clone(); // This is why the classtree all needs to be cloneable
// now copy values of all members to the new obj.
// be carefull to not copy references
clonedobj.setMyMember(this.getMyMember()); // copy of member var;
clonedobj.setMyotherMember(this.getMyOtherMember().clone()); // a composit obj must be cloned.
}
`
これはアンサーになることができますか?
多くの場合、クラスは通常、クローンが実装されていない状態で作成されます。そのため、子クラスが作成されるときも同様に実装されていないクローンで作成されます。ある時点で、子クラスにクローン メソッドを記述する必要がありますが、その親にはクローン メソッドがありません。