"क्यों नहीं Cloneableनिकाला जाता है?" (या वास्तव में, Xकिसी के लिए पदावनत क्यों नहीं किया जाता हैX जाता है), यह है कि उन्हें पदावनत करने पर ज्यादा ध्यान नहीं दिया गया है।
हाल ही में हटाए गए अधिकांश चीजों को हटा दिया गया था क्योंकि उन्हें हटाने के लिए एक विशिष्ट योजना है। उदाहरण के लिए, LogManager के तरीकों addPropertyChangeListenerऔर removePropertyChangeListenerतरीकों को Java SE 8 में हटाने के इरादे से Java SE 8 में अपदस्थ किया गया था (इसका कारण यह है कि वे अनावश्यक रूप से जटिल अन्योन्याश्रित मॉड्यूल हैं।) दरअसल, इन APIs को पहले ही JDK 9 के विकास से हटा दिया गया है। बनाता है। (ध्यान दें कि समान संपत्ति परिवर्तन श्रोता कॉल को भी हटा दिया गया था Pack200; देखें JDK-8029806 ।)
ऐसा कोई समान योजना के लिए के लिए मौजूद है CloneableऔरObject.clone() ।
एक लंबे उत्तर में आगे के प्रश्नों पर चर्चा करना शामिल होगा, जैसे कि कोई व्यक्ति इन एपीआई से क्या होने की उम्मीद कर सकता है, अगर लागत में कमी या लाभ प्लेटफ़ॉर्म को जमा कर देगा, और जब एक एपीआई अपग्रेड किया जाता है, तो डेवलपर्स को क्या सूचित किया जाएगा। मैंने अपने हालिया JavaOne टॉक, डेट और डिप्रेसेशन में इस विषय का पता लगाया । (उस लिंक पर उपलब्ध स्लाइड्स; वीडियो यहां ।) यह पता चला है कि जेडीके खुद ही अपने उपयोग के अभाव में बहुत सुसंगत नहीं है। इसका उपयोग कई अलग-अलग चीजों के लिए किया जाता है, उदाहरण के लिए,
यह खतरनाक है और आप इसे का उपयोग कर के जोखिम के बारे में पता होना चाहिए (उदाहरण: Thread.stop(), Thread.resume(), और Thread.suspend())।
भविष्य में रिलीज़ में इसे हटा दिया जाएगा
यह अप्रचलित है और आपके लिए कुछ अलग उपयोग करना एक अच्छा विचार है (उदाहरण: कई विधियों में java.util.Date)
ये सभी अलग-अलग अर्थ हैं, और उनमें से अलग-अलग उपसमुच्चय अलग-अलग चीजों पर लागू होते हैं जो अपवित्र हैं। और उनमें से कुछ सबसेट उन चीजों पर लागू होते हैं जो अपवित्र नहीं होते हैं (लेकिन यह कि शायद पदावनत किया जाना चाहिए)।
Cloneableऔर Object.clone()इस अर्थ में "टूट" गए हैं कि उनके पास डिजाइन दोष हैं और सही ढंग से उपयोग करना मुश्किल है। हालांकि, clone()अभी भी सरणियों की नकल करने का सबसे अच्छा तरीका है, और क्लोनिंग में कक्षाओं के उदाहरणों की प्रतियां बनाने के लिए कुछ सीमित उपयोगिता है जो सावधानीपूर्वक कार्यान्वित की जाती हैं। क्लोनिंग को हटाना एक असंगत परिवर्तन होगा जो बहुत सारी चीजों को तोड़ देगा। एक क्लोनिंग ऑपरेशन को एक अलग तरीके से फिर से लागू किया जा सकता है, लेकिन यह शायद की तुलना में धीमा होगाObject.clone() ।
हालांकि, ज्यादातर चीजों के लिए एक कॉपी कंस्ट्रक्टर क्लोनिंग के लिए बेहतर है। तो शायद अंकनCloneable "अप्रचलित" या "सुव्यवस्थित" या कुछ इसी तरह के रूप में करना उचित होगा। यह डेवलपर्स को बताता है कि वे शायद कहीं और देखना चाहते हैं, लेकिन यह संकेत नहीं देगा कि क्लोनिंग तंत्र को भविष्य के रिलीज में हटाया जा सकता है। दुर्भाग्य से, ऐसा कोई मार्कर मौजूद नहीं है।
जैसे ही चीजें खड़ी होती हैं, "पदावनति" अंततोगत्वा निष्कासन को लगता है - इस तथ्य के बावजूद कि हटाए गए सुविधाओं की एक छोटी संख्या को कभी हटा दिया गया है - और इसलिए प्रतिरूपण क्लोनिंग तंत्र के लिए वारंट नहीं लगता है। शायद भविष्य में एक वैकल्पिक अंकन लागू किया जा सकता है जो डेवलपर्स को इसके बजाय वैकल्पिक तंत्र का उपयोग करने का निर्देश देता है।
अपडेट करें
मैंने बग रिपोर्ट में कुछ अतिरिक्त इतिहास जोड़े हैं । एक प्रारंभिक जेवीएम कार्यान्वयनकर्ता और जेवीएम विनिर्देश के सह-लेखक, फ्रैंक येलिन ने दूसरे उत्तर में उद्धृत टीआरसी सिफारिश में "समय की मुट्ठी में खोए" टिप्पणी के जवाब में कुछ टिप्पणियां कीं । मैंने यहां प्रासंगिक अंश उद्धृत किए हैं; पूरा संदेश बग रिपोर्ट में है।
क्लोन करने योग्य के पास उसी कारण के लिए कोई विधि नहीं है जो Serializable नहीं करता है। क्लोन करने योग्य वर्ग की एक संपत्ति को इंगित करता है, बजाय विशेष रूप से उन तरीकों के बारे में कुछ भी कह रहा है जो वर्ग का समर्थन करता है।
प्रतिबिंब से पहले, हमें किसी वस्तु की उथली प्रतिलिपि बनाने के लिए एक देशी विधि की आवश्यकता होती है। इसलिए Object.clone () का जन्म हुआ। यह भी स्पष्ट था कि कई वर्ग इस पद्धति को ओवरराइड करना चाहेंगे, और यह कि हर वर्ग क्लोन नहीं बनाना चाहेगा। इसलिए प्रोग्रामर का इरादा इंगित करने के लिए क्लोन करने योग्य पैदा हुआ था।
तो, संक्षेप में। क्लोन करने योग्य का उद्देश्य यह बताना नहीं था कि आपके पास एक सार्वजनिक क्लोन () विधि है। यह इंगित करना था कि आप Object.clone () का उपयोग करके क्लोन किए जाने के लिए तैयार हैं, और यह क्लोन () सार्वजनिक करने के लिए तय करने के लिए कार्यान्वयन पर निर्भर था।