你有三種選擇:
- 對
IAnimal
的方法,深入克隆對象(使用庫,如DOM接口,如Node.cloneNode(boolean)
)
- 在
IAnimal
的所有實現中創建一個拷貝構造函數,該構造函數接受具體類型並將其作爲一個需求nt,然後用反射來訪問它
- 創建一個複製工廠,將手動複製每個實現
- 使用一個第三方庫,通過自己的合約爲您實現深度克隆,例如no-args構造函數,非final字段,
Serializable
類,等等。像上市here
複製方法
#1的那些,做這樣的事情:
public interface IAnimal {
IAnimal cloneDeep();
}
實現,在你的具體類型,則調用該方法複製它:
this.pet = pet.cloneDeep();
然後在接口中記錄要求,說s沿線的omething:
這個接口必須返回一個對象不是==
這種情況下,必須深刻克隆所以這個對象是操作不會導致返回一個操作的實現反之亦然。
實現將不得不遵循本合同以符合接口,但這不會在編譯時強制執行。
拷貝構造函數
嘗試反思訪問拷貝構造函數,然後指出拷貝構造函數在接口,即接口契約的一部分的所有具體實現需要。然後,每個實現應該是這樣的:
public class Dog implements IAnimal {
private String name;
public Dog(Dog dog) {
this.name = dog.name;
}
}
然後所有你需要的是每個執行復制了一個方法:
public static <A extends IAnimal> A copy(A animal) {
Class<?> animalType = animal.getClass();
// This next line throws a number of checked exceptions you need to catch
return (A) animalType.getConstructor(animalType).newInstance(animal);
}
一個你有這樣的,在你的界面添加一個聲明,這個效果文檔:
這個接口
的
實現必須定義一個拷貝構造函數的類的相同類型或超類型的參數。這個構造函數必須對參數進行深層次的拷貝,以便對這個對象的操作不會導致對返回操作的操縱,反之亦然。
此外,這是運行時強制執行。上面的copy
方法在構造函數不存在時拋出NoSuchMethodException
錯誤。
複製廠
這利用了IAnimal
並使用instanceof
決定哪些方法將它傳遞給,如:
public static IAnimal copyAnimal(IAnimal animal) {
if (animal instanceof Dog)
return copyDog((Dog) animal);
if (animal instanceof Cat)
return copyCat((Cat) animal);
//...
else
throw new IllegalArgumentException("Could not copy animal of type: "
+ animal.getClass().getName());
}
然後執行深度複製在copy
方法對於每種類型的手動。
如果你想要一個深層拷貝,你應該在Animal中實現一個拷貝構造函數。 – alfasin
你不能簡單地在Animal中實現一個複製構造函數。在這種情況下,你有一個接口IAnimal。所以你需要知道你需要實例化的具體類。 – Mene