.clone()
विधि java.lang.Cloneable
इंटरफ़ेस में निर्दिष्ट क्यों नहीं थी?जावा: क्लोनेबल इंटरफ़ेस का तर्क
उत्तर
असल में, यह एक टूटी हुई इंटरफ़ेस है। केन अर्नाल्ड और बिल वेनेर्स ने Java Design Issues में इसकी चर्चा की।
अर्नोल्ड:
अगर मैं इस बिंदु पर भगवान थे, और कई लोगों को शायद खुशी है कि मैं नहीं कर रहा हूँ कर रहे हैं, मैं
Cloneable
विरोध करते है और एकCopyable
है, क्योंकिCloneable
समस्या है कहेंगे। इस तथ्य के अलावा कि यह गलत वर्तनी है,Cloneable
मेंclone
विधि नहीं है। इसका मतलब है कि अगर आपCloneable
का उदाहरण हैं, तो आप परीक्षण नहीं कर सकते हैं, इसेCloneable
पर डालें, औरclone
पर आक्रमण करें। आपको दोबारा प्रतिबिंब का उपयोग करना होगा, जो भयानक है। यह केवल एक समस्या है, लेकिन एक मैं निश्चित रूप से हल करूँगा।
जावा कीड़े डेटाबेस में इस बग देखें:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033
मूलतः, यह के रूप में करने के लिए है कि वे Cloneable इंटरफ़ेस में ठीक करने के लिए इच्छुक नहीं कर रहे हैं जावा के पुराने संस्करणों में एक डिजाइन दोष है तो होगा कुछ मौजूदा कोड के साथ संगतता तोड़ो।
मुझे आश्चर्य है कि क्यों वे जावा 1.2 'Copyable' इंटरफेस नहीं जोड़ा था, और उससे आगे ... – EpicPandaForce
@EpicPandaForce शायद इसलिए है क्योंकि हम नहीं कुछ स्थितियों में C++ की नकल करना चाहते हैं। क्लोनिंग का उपयोग देखभाल के साथ किया जाना चाहिए, अधिकांश समय यह प्राप्त नहीं होता है कि आप इसे प्राप्त करना चाहते हैं। जावा में गायब चीज 'const' पैरामीटर होना है, लेकिन प्रत्येक (mutable) ऑब्जेक्ट उदाहरण की प्रतिलिपि बनाना एक अच्छा समाधान नहीं है। और हाँ, कुछ चीजें हैं जिनमें जावा बेकार है, और यह उनमें से एक है।कोटलिन/डेटा कक्षाओं का प्रयोग करें। –
क्योंकि क्लोन विधि को "विशेष" स्थिति के कारण ऑब्जेक्ट क्लास में लागू किया गया है: किसी भी प्रकार की वस्तुओं की स्मृति प्रति।
जावा में, मार्कर इंटरफेस की यह अवधारणा है। Cloneable
इंटरफ़ेस में कोई विधियां या फ़ील्ड नहीं हैं और केवल क्लोनेबल होने के अर्थशास्त्र की पहचान करने के लिए कार्य करता है।
:
अक्सर आप जावा में इंटरफेस कोई व्यवहार है कि भर में आ जाएगा। दूसरे शब्दों में, वे सिर्फ खाली इंटरफ़ेस परिभाषाएं हैं। इन्हें मार्कर इंटरफेस के रूप में जाना जाता है। जावा एपीआई में मार्कर इंटरफेस के कुछ उदाहरणों में शामिल हैं:
मुझे नहीं लगता कि यह एक अजीब अवधारणा है। कभी-कभी यह देखने में सक्षम होता है कि कुछ वैकल्पिक प्रकार के रूप में कार्य कर सकता है या नहीं। जैसा कि अन्य ने कहा है, क्लोनबल हालांकि टूटा हुआ है। –
वे मिश्रण के रूप में कार्य करने के लिए माना जाता है। जावा जैसे दृढ़ टाइप की गई भाषा में मेरा पसंदीदा तंत्र नहीं है, लेकिन यह Serializable, sorta के लिए समझ में आता है। – wds
@ सेरियलज़ेबल ने और अधिक समझदारी की होगी। या कम से कम यह एक दशक पहले आया था अगर कम से कम किया होगा। –
परियोजना मैं पर काम पर, हम एक अंतरफलक PublicCloneable कहा जाता है, यह क्लोन विधि शामिल है और यह बताता है कि यह सार्वजनिक है बना लिया है।
मुझे यह एक उपयोगी लगता है: तथ्य यह है कि क्लोन विधि है, लेकिन आप इसका उपयोग नहीं कर सकते हैं, इससे बहुत मदद नहीं मिलती है।
public interface PublicCloneable extends Cloneable {
public Object clone();
}
इस इंटरफ़ेस (PublicConeable) का उपयोग करने का तरीका क्या होगा? – Otto
@ ओटो: उदाहरण के लिए, क्लोनहेल्पर एक विधि सार्वजनिक स्थैतिक सार्वजनिक क्लोनेबल प्रतिलिपि (पब्लिकक्लोनेबल ओबीजे), जो शून्य के लिए जांचता है, या केवल प्रतिलिपि (ऑब्जेक्ट ओबीजे) के साथ क्लोनहेल्पर, और सार्वजनिक क्लोनेबल –
दोनों शून्य और उदाहरण दोनों को चेक करता है जब आप किसी ऑब्जेक्ट को स्थानीय से वापस करते हैं उदाहरण के लिए कैश ... उसने कहा, serializing/deserializing शायद सुरक्षित है। –
डिजाइन मूर्खतापूर्ण है। मैं सोच रहा हूं कि सूर्य ने कभी यह क्यों तय नहीं किया। – tactoth
जावा 8 में यह क्यों तय नहीं किया गया था? जावा के टूटे/अप्रभावी हिस्सों को पहले हटाया/बदला नहीं गया है? –
यह "टूटा हुआ" है क्योंकि कुछ लोग ऐसा कहते हैं? "क्लोनेबल में क्लोन विधि नहीं है" हां, और इसके दस्तावेज़ीकरण ने कभी नहीं कहा था। "इसका मतलब है कि अगर आप कुछ क्लोनेबल का उदाहरण हैं, तो इसे क्लोनेबल में डालें, और क्लोन का आह्वान करें।" फिर, यह 'क्लोनेबल' का उद्देश्य नहीं है। 'क्लोनेबल' सिर्फ 'ऑब्जेक्ट.क्लोन()' को अपवाद फेंकने के लिए है या नहीं। 'क्लोन' का आह्वान करने के लिए यह कभी भी एक इंटरफ़ेस नहीं रहा है। शायद यह अच्छा होगा अगर जावा में ऐसा इंटरफ़ेस था, लेकिन किसी की कमी से कोई और इंटरफ़ेस ('क्लोनेबल') टूटा नहीं जाता है। – newacct