2010-03-23 30 views
24

Tôi đang cố gắng tạo bản sao sâu của một đối tượng, bao gồm một phiên bản GregorianCalendar. Tôi luôn cảnh giác với việc sử dụng clone() và dường như nó không bị ghi đè ở đây, vì vậy tôi chỉ đang thực hiện trường sao chép theo trường. Lý tưởng nhất, có muốn được một constructor sao chép, mà tôi có thể sử dụng như sau:Cách nhanh nhất để sao chép một GregorianCalendar?

GregorianCalendar newCalendar = new GregorianCalendar(oldCalendar); 

Đáng tiếc là tôi không thể tìm thấy bất kỳ chức năng như vậy trong API và đang mắc kẹt cố gắng tìm ra các lĩnh vực mà tôi cần để có được một bản sao chính xác. Vì vậy, để tạo một bản sao của một trong các lịch này, bạn sẽ làm như thế nào? Tôi có thiếu một số phím tắt đơn giản ở đây không?

Trả lời

36

java.util.Calendar đã ghi đè clone() đang hoạt động, vì vậy hãy sử dụng. Hơn nữa, Calendar không có phân cấp dữ liệu sâu - dữ liệu của nó chủ yếu là int s.

Để mở rộng câu trả lời, bạn có thể gọi SerializationUtils.clone(..) (từ commons-lang) trên bất kỳ đối tượng mà làm cho một bản sao sâu, nếu hệ thống phân cấp dữ liệu toàn bộ thực hiện Serializable

+0

Tôi đã không hoàn toàn rõ ràng về lý do tại sao tôi tránh 'clone() '. Trong trường hợp này, tôi chỉ theo lời khuyên của Joshua Bloch về việc tạo bản sao phòng thủ. Kể từ khi clone() có thể hình dung được gọi là một lớp con clone() phương pháp tôi có thể kết thúc với một bản sao không sạch sẽ. Một chút học vấn trong trường hợp của tôi, nhưng đó là lý do tại sao tôi đã tránh nó. – wds

+0

như tôi đã nói, dữ liệu trong Lịch không bị ảnh hưởng bởi vấn đề này - tất cả dữ liệu của nó là nguyên thủy. Và phương pháp nhân bản trong 'Calendar' hoạt động tốt. – Bozho

+0

Quan điểm của ông là bạn có thể hình dung ra một lớp con giữ một tham chiếu đến thể hiện lịch ban đầu và giữ tham chiếu đó xung quanh. Nếu, nói rằng, tất cả người định cư sẽ đặt giá trị trong phiên bản gốc thay vì bản sao mới, bản sao "sâu" của bạn giờ đây sẽ bị xâm phạm. – wds

-7

Uh, clone() hút.

Có khó không? Bạn chỉ cần đặt 3 thứ, tôi tin, thời gian, múi giờ và ngôn ngữ. Tất cả những lĩnh vực đó có getters và setters. Làm cho một phương pháp khá tiện ích để trả lại một bản sao?

+0

Tôi không hiểu; kể từ khi cả Lịch và GregorianCalendar triển khai các phương thức sao chép tùy chỉnh, tại sao nó không thích hợp để sử dụng chúng? –

+0

Độ cứng sai. Người lập trình giỏi thì lười. –

0

Cụ thể, dòng nhanh nhất của mã để sao chép một Lịch là:

GregorianCalendar newCalendar = (Calendar)(oldCalendar.clone()); 
Các vấn đề liên quan