2013-07-31 45 views
7

Tôi luôn nghĩ rằng clone() tạo một đối tượng mà không cần gọi hàm tạo.Có thể sao chép phương thức tạo đối tượng bằng cách sử dụng hàm tạo

Nhưng, khi đọc Java hiệu quả Khoản 11: Ghi đè bản sao sáng suốt, tôi thấy một tuyên bố mà nói rằng

Việc cung cấp rằng “không có nhà xây dựng được gọi là” quá mạnh. Một phương thức sao chép tốt có thể gọi các nhà thầu để tạo các đối tượng nội bộ vào bản sao đang được xây dựng. Nếu lớp là cuối cùng, sao chép thậm chí có thể trả về một đối tượng được tạo bởi một hàm tạo.

Ai đó có thể giải thích điều này cho tôi không?

+1

phương thức 'clone()' không gọi hàm tạo, hành vi mặc định của nó là nó sẽ thực hiện bản sao nông. nhưng nếu chúng ta muốn thực hiện bản sao sâu, chúng ta cần ghi đè phương thức 'clone()', từ đó chúng ta có thể trả về đối tượng mới. – swapy

Trả lời

12

Tôi luôn nghĩ rằng clone() tạo đối tượng mà không cần gọi hàm tạo.

Việc triển khai trong Object.clone() không gọi hàm tạo.

Không có gì ngăn bạn tự thực hiện nó theo cách thực hiện. Ví dụ, đây là một hoàn toàn hợp lệ clone() thực hiện:

public final class Foo implements Cloneable { 
    private final int bar; 

    public Foo(int bar) { 
     this.bar = bar; 
    } 

    @Override 
    public Object clone() { 
     return new Foo(bar); 
    } 
} 

Bạn chỉ có thể làm được điều này (vô điều kiện) nếu lớp là final, bởi vì sau đó bạn có thể đảm bảo được trả lại một đối tượng cùng loại như bản gốc.

Nếu lớp không phải là cuối cùng, tôi đoán bạn có thể kiểm tra xem trường hợp là "chỉ là" một thể hiện của loại trọng clone() và xử lý nó khác nhau ở các trường hợp khác nhau ... nó sẽ là kỳ lạ để làm như vậy Tuy nhiên.

+0

Tại sao tôi chỉ có thể làm điều này nếu lớp học là cuối cùng? Nếu tôi làm điều này trong lớp không phải cuối cùng, sẽ có bất kỳ loại tác động nào không? – Anand

+2

@Anand: 'clone()' phải trả về một thể hiện cùng loại với bản gốc. Nếu lớp không phải là cuối cùng, bạn phải xem xét khả năng 'this' sẽ tham chiếu đến một cá thể của một lớp con. –

Các vấn đề liên quan