Bạn có một trong ba lựa chọn:
- Có một phương pháp trên
IAnimal
nhân bản sâu sắc đối tượng (được sử dụng bởi các thư viện như giao diện DOM như Node.cloneNode(boolean)
)
- Tạo một trình tạo bản sao trong tất cả các lần triển khai
IAnimal
có loại bê tông và làm cho yêu cầu nt trong hợp đồng giao diện, sau đó sử dụng phản ánh để truy cập nó
- Tạo một nhà máy copy sẽ copy từng thực hiện bằng tay
- Sử dụng thư viện của bên thứ 3 mà thực hiện nhân bản sâu sắc đối với bạn với các hợp đồng riêng của mình, chẳng hạn như không-args các nhà xây dựng, các trường phi chính thức,
Serializable
lớp học, v.v., Giống như những người được liệt kê here
Sao chép Phương pháp
Đối # 1, làm như sau:
public interface IAnimal {
IAnimal cloneDeep();
}
Thực hiện rằng trong các loại bê tông, sau đó gọi phương thức đó để sao chép nó:
this.pet = pet.cloneDeep();
Sau đó ghi lại yêu cầu trong giao diện, nói rằng omething dọc theo dòng:
Triển khai các giao diện này phải trả về một đối tượng mà không ==
là trường hợp này, và phải được nhân bản sâu sắc để thao tác của đối tượng này không dẫn đến thao tác của trả lại một và ngược lại.
Triển khai sẽ phải tuân theo hợp đồng này để tuân thủ giao diện, nhưng điều này sẽ không được thực thi tại thời điểm biên dịch.
Sao chép Constructor
Cố gắng truy cập vào một constructor sao chép phản tư, sau đó nói rằng một constructor sao chép là cần thiết trong tất cả triển khai cụ thể trong giao diện, mà trở thành một phần của hợp đồng giao diện. Mỗi thực hiện sau đó sẽ trông như thế này:
public class Dog implements IAnimal {
private String name;
public Dog(Dog dog) {
this.name = dog.name;
}
}
Và sau đó tất cả bạn cần là một phương pháp duy nhất để sao chép tất cả các thực hiện:
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);
}
Một bạn có điều này, thêm một tuyên bố để hiệu ứng này trong của giao diện của bạn tài liệu:
Triển khai giao diện này xác định hàm tạo bản sao tham gia cùng một loại hoặc siêu kiểu của lớp học. Nhà xây dựng này phải tạo một bản sao sâu của đối số để thao tác của đối tượng này không dẫn đến thao tác của đối tượng được trả về và ngược lại.
Một lần nữa, đây là thời gian chạy được thi hành. Phương thức copy
ở trên ném các lỗi NoSuchMethodException
khi hàm tạo không tồn tại.
Sao chép Factory
này có các IAnimal
và sử dụng instanceof
để quyết định phương pháp để vượt qua nó để, như:
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());
}
Sau đó làm việc sao chép sâu trong copy
phương pháp đối với từng loại bằng tay .
Nếu bạn muốn có một bản sao sâu, bạn nên triển khai một trình tạo bản sao trong Động vật. – alfasin
Bạn không thể chỉ đơn giản là thực hiện một bản sao-constructor trong động vật. Trong trường hợp này bạn có IAnimal, một giao diện. Vì vậy, bạn sẽ cần biết lớp bê tông nào bạn cần để khởi tạo. – Mene