2010-03-23 21 views
24

मैं GregorianCalendar उदाहरण सहित किसी ऑब्जेक्ट की गहरी प्रतिलिपि बनाने की कोशिश कर रहा हूं। मैं हमेशा clone() का उपयोग करने से सावधान हूं और ऐसा लगता है कि यह यहां ओवरराइड नहीं हुआ है, इसलिए मैं सिर्फ फ़ील्ड द्वारा कॉपी फ़ील्ड कर रहा हूं।ग्रेगोरियन कैलेंडर को क्लोन करने का सबसे तेज़ तरीका?

GregorianCalendar newCalendar = new GregorianCalendar(oldCalendar); 

दुर्भाग्य से मैं एपीआई में किसी भी ऐसी कार्यक्षमता नहीं मिल रहा है और कौन सी फ़ील्ड मैं एक प्राप्त करने की आवश्यकता पता लगाने की कोशिश अटक कर रहा हूँ: आदर्श रूप में, वहाँ एक प्रति निर्माता है, जो मुझे बहुत पसंद है इस्तेमाल कर सकते हैं होगा सटीक प्रति। तो, इन कैलेंडर में से किसी एक की प्रतिलिपि बनाने के लिए, आप इसे कैसे करेंगे? क्या मुझे यहां कुछ सरल शॉर्टकट याद आ रहा है?

उत्तर

36

java.util.Calendarclone() ओवरराइड किया गया है जो काम कर रहा है, इसलिए इसका उपयोग करें। इसके अलावा, Calendar में गहरी डेटा पदानुक्रम नहीं है - इसका डेटा मुख्य रूप से int है।

जवाब का विस्तार करने के लिए, आप, SerializationUtils.clone(..) (commons-lang से) किसी भी वस्तु जो एक गहरी प्रतिलिपि बनाता है पर कॉल कर सकते हैं पूरे डेटा पदानुक्रम लागू करता Serializable

+0

मैं 'कारण है कि मैं कर रहा हूँ से बचने क्लोन पर काफी स्पष्ट नहीं था()'। इस मामले में मैं रक्षात्मक प्रतियां बनाने पर जोशुआ ब्लोच से सलाह का पालन कर रहा हूं। चूंकि क्लोन() अनुमानतः एक सबक्लास क्लोन() विधि को कॉल कर सकता है, इसलिए मैं एक गैर-साफ प्रति के साथ समाप्त हो सकता हूं। मेरे मामले में थोड़ा सा अकादमिक, लेकिन यही कारण है कि मैं इसे टाल रहा था। – wds

+0

जैसा कि मैंने कहा था, कैलेंडर में डेटा इस समस्या से प्रभावित नहीं है - इसका सभी डेटा आदिम है। और 'कैलेंडर' में क्लोन विधि ठीक काम करती है। – Bozho

+0

उनका मुद्दा यह है कि आप कल्पना कर सकते हैं कि एक उप-वर्ग जो मूल कैलेंडर उदाहरण का संदर्भ रखता है और उस संदर्भ को आसपास रखता है। यदि, कहें, सभी सेटर्स नए उदाहरण के बजाय मूल उदाहरण में मूल्य निर्धारित करेंगे, तो आपकी "गहरी" प्रतिलिपि अब समझौता की जाएगी। – wds

-7

उह, clone() बेकार है।

क्या यह मुश्किल है? आपको केवल 3 चीजें सेट करना है, मुझे विश्वास है, समय, समय क्षेत्र और लोकेल। उन सभी क्षेत्रों में गेटर्स और सेटर्स हैं। एक प्रतिलिपि वापस करने के लिए एक काफी उपयोगिता विधि बनाओ?

+0

मुझे समझ में नहीं आता; चूंकि कैलेंडर और ग्रेगोरियन कैलेंडर दोनों कस्टम क्लोन विधियों को लागू करते हैं, इसलिए उनका उपयोग करने के लिए उचित क्यों नहीं होगा? –

+0

कठोरता झुकाव। अच्छे प्रोग्रामर आलसी हैं। –

0

विशेष रूप से, कोड की तेज लाइन एक कैलेंडर कॉपी करने के लिए है:

GregorianCalendar newCalendar = (Calendar)(oldCalendar.clone()); 
संबंधित मुद्दे