मैं एक सरणी की एक गहरी प्रतिलिपि सही ढंग से करने पर पढ़ रहा था, हालांकि मैं #clone()
को कार्यान्वित करने के बारे में उलझन में था। यह java.lang.Object
वर्ग का एक सदस्य है, और अभी तक अगर आप javadocs पढ़ें:क्लोन करने योग्य इंटरफ़ेस में #clone() क्यों नहीं है?
पहला, अगर इस वस्तु के वर्ग इंटरफ़ेस Cloneable को लागू नहीं करता है, तो एक CloneNotSupportedException फेंक दिया है।
तो पहले स्थान पर clone
विधि को परिभाषित क्यों करें? निश्चित रूप से यदि कोई इंटरफ़ेस मौजूद होने पर केवल एक विधि का उपयोग किया जा सकता है, तो आप विधि को इंटरफ़ेस में डाल देंगे। Cloneable
इंटरफ़ेस स्वयं खाली है; यह जावा द्वारा उपयोग किया जाने वाला एक मार्कर इंटरफ़ेस है यह सुनिश्चित करने के लिए कि clone
विधि का उपयोग कानूनी है।
यह ऐसा तरीका भी प्रकार सुरक्षा सुनिश्चित करने के जेनरिक का उपयोग करने के क्षमता को निकालता है:
class Foo implements Cloneable { // Valid.
@Override
public Object clone() throws CloneNotSupportedException {
// ...
}
}
class TypeSafeFoo implements Cloneable<TypeSafeFoo> { // Not valid.
@Override
public TypeSafeFoo clone() throws CloneNotSupportedException {
// ...
}
}
जावा इसे इस तरह क्यों किया? मुझे यकीन है कि उनके पास वैध कारण हैं, लेकिन मुझे इसका पता लगाना प्रतीत नहीं होता है।
असल में यह एक डिजाइन दोष के रूप में यहोशू बलोच –
यह क्लोनिंग टूटी माना जाता है कई कारणों में से एक है द्वारा कहा था: आप बस एक वस्तु जो इस util द्वारा
Cloneable
लागू करता क्लोन कर सकते हैं। –