यदि मेरी आईडीई इतनी स्मार्ट है, तो मुझे "क्लोन ()" डालने की आवश्यकता क्यों है?


13

मेरा आईडीई ( नेटबीन्स ) टाइप Collectionsकरते समय मेरी जांच करता है कि मैं कोड लिख रहा हूं। लेकिन फिर, मुझे लौटी हुई वस्तु को क्यों डालना है Object.clone()? जो ठीक है। कोई नुकसान नहीं कोई माफी नहीं। लेकिन फिर भी, मुझे समझ नहीं आया।

क्या टाइपिंग की जाँच हो रही है, बिना ढलाई के, लौटी हुई वस्तु Object.clone()संभव नहीं है? जेनरिक ढांचे मुझे लगता है आईडीई जांच कर सकता है बनाता है प्रकार "के दाईं ओर स्थित वस्तु संदर्भ के = कास्टिंग, जबकि मैं टाइपिंग कर रहा हूँ बिना" निशान? मुझे नहीं मिला।

परिशिष्ट
मेरा उपयोग मामला सिर्फ यह था कि मेरे पास एक निजी Calendarक्षेत्र, पबडेट था । मैं लिखने जा रहा था:

Calendar getPubdate() {
    return pubdate;
}

लेकिन एक जोखिम है कि आक्रमणकारी मेरे यौवन को संशोधित कर सकता है , इसलिए मैंने एक प्रति लौटा दी:

Calendar getPubdate() {
    return (Calendar) pubdate.clone();
}

फिर, मैंने सोचा कि मुझे कास्ट करने की आवश्यकता क्यों है pubdate.clone()। विधि हस्ताक्षर का अधिकार वहाँ है। नेटबीन्स को यह पता लगाने में सक्षम होना चाहिए कि एक बाहर। और NetBeans के संबंध में ऐसा ही कुछ लग रहा था Collections


5
एक छोटा (!) कोड उदाहरण सहायक होगा।
डॉक्टर ब्राउन

78
IDE भाषा से अलग है, इसलिए स्मार्ट Netbeans का जावा भाषा के काम करने के तरीके पर कोई प्रभाव नहीं पड़ता है।
जैक्सबी

7
ध्यान दें, प्रकार सहप्रसरण लौटने के कारण, यह वापस जाने के लिए सिफारिश की है MyObjectसे clone()बजाय Object- यह इस पूरे मुद्दे को निकाल देता है। इसे आगे कभी उपयोग न करने की सलाह दी जाती है clone()(प्रभावी जावा आइटम # 11)।
बोरिस स्पाइडर

क्या आपके प्रश्न का जोर I या 'कास्ट' क्लोन () "'पर है ? क्योंकि पूर्व से उत्पन्न प्रश्न वास्तव में उत्तरार्द्ध की तुलना में बहुत बेहतर प्रश्न हो सकता है।
user541686

जब मैं प्रश्न शीर्षक पढ़ता हूं, तो केवल एक चीज जो मुझे लगता है this.clone()कि प्रोग्रामर ऑब्जेक्ट पर है, विशेष रूप से मंगल की रात में तुए की रिहाई के बाद। क्षमा करें, लेकिन मुझे यह टिप्पणी लिखनी है। क्यों स्मार्ट आईडीई हमारे लिए सभी बगों को ठीक नहीं करता है LOL
माई

जवाबों:


53

मुझे लौटी हुई वस्तु को क्यों डालना है Object.clone()?

क्योंकि यह लौटता है Object

जेनरिक ढांचे मुझे लगता है आईडीई जांच कर सकता है बनाता है प्रकार "के दाईं ओर स्थित वस्तु संदर्भ के = कास्टिंग, जबकि मैं टाइपिंग कर रहा हूँ बिना" निशान? मुझे नहीं मिला।

Object.clone सामान्य नहीं है।

अगर cloneडिजाइन किए जाने के समय जेनेरिक मौजूद थे , तो यह संभवतः इस तरह दिखाई देता था (एफ-बाउंडेड पॉलीमोर्फिज्म का उपयोग करते हुए):

interface Cloneable<T extends Cloneable<T>> {
  T clone();
}

यदि जावा में MyType सुविधा होती, तो यह शायद इस तरह दिखाई देती:

interface Cloneable {
  this clone();
}

लेकिन जेनरिक Object.cloneका डिज़ाइन होने के समय अस्तित्व में नहीं था, और जावा में MyTypes नहीं है, इसलिए टाइप-असुरक्षित संस्करण वह Object.cloneहै जिसके साथ हमें काम करना है।


मुझे सिर्फ एहसास हुआ कि आईडीई फीचर जो मुझे भ्रमित करता था, वह पृष्ठभूमि संकलन था? मेरा मतलब है, जो कोड को पूरा करने और जेनेरिक के साथ ऑटो प्रकार की जांच करने में सक्षम बनाता है? व्यक्तिगत रूप से, मैं एक स्पष्ट संकलन तक देरी प्रकार की जाँच करना पसंद करूँगा। लेकिन मैं लव कोड पूरा करता हूं।
कोनिशिकी

1
जावा 8 के साथ @konishiki (और कुछ हद तक जावा 7) प्रकार का अनुमान , किसी भी सहायता को प्रदान करने के लिए, IDE को निम्न प्रकारों की आवश्यकता होती है। इसके लिए आंशिक संकलन की आवश्यकता है। प्रकार के अनुमान से पहले, स्वत: पूर्णता के लिए किसी भी संकलन की आवश्यकता नहीं है।
बोरिस स्पाइडर

@BoristheSpider कि प्रतिक्रिया के लिए बहुत बहुत धन्यवाद! मुझे निश्चित रूप से कुछ और परीक्षण / सोच करने की जरूरत है। बहुत ज्यादा अधिमूल्यित।
कोनिशिकी

आपको पास करने की आवश्यकता क्यों होगी original?
क्लैशॉफ्ट

@ क्लेशॉफ्ट: स्पष्ट कार्यात्मक प्रोग्रामिंग संस्करण को अपनाने के दौरान मूर्ख विचार। धन्यवाद।
जोर्ग डब्ल्यू मित्तग

26

यह किसी आईडीई की विशेषता नहीं है, बल्कि भाषा की परिभाषा है।

एक आईडीई आपको एक प्रोग्रामिंग भाषा का अधिक कुशलता से उपयोग करने में मदद करता है, यह उस भाषा के शब्दार्थ को नहीं बदलता है। इसका मतलब है कि एक संपादक सहायक स्वचालित रूप से एक कास्ट डाल सकता है जब यह स्पष्ट हो कि आप जो चाहते हैं, लेकिन यह बस भाषा के नियमों को तोड़ नहीं सकता है और उस कोड का दिखावा करता है जो संकलन नहीं करता है वह वैध है।

संपादित करें यह सच है कि एक IDE अपने स्वयं के संकलक को बंडल कर सकता है, और वास्तव में कई ऐसा करते हैं, जैसे कि आंशिक पार्स ट्री में अधिक जानकारी के साथ बेहतर त्रुटि रिपोर्टिंग के लिए। हालांकि, इस आंतरिक संकलक को आधिकारिक एसडीके की तुलना में अलग-अलग भाषा के शब्दार्थों को लागू करने देने के लिए यह एक बहुत बुरा विचार होगा, क्योंकि इसका मतलब यह होगा कि विकास में काम करने वाला कोड उत्पादन में स्थापित होने पर रहस्यमय तरीके से विफल होना शुरू कर सकता है - ऐसी समस्याएं जो परिभाषा के अनुसार हैं- डीबग करने योग्य!


यह वही हुआ है: मुझे पूरा यकीन है कि कोड पूरा करना एक आईडीई सुविधा है (प्रतिबिंब के माध्यम से)। और जिस ऑटो टाइप चेकिंग की मैं बात कर रहा था वह आईडीई (पृष्ठभूमि संकलन के माध्यम से) में होता है। मुझे उम्मीद है कि यही चल रहा है।
कोनिशिकी

1
आईडीई कर सकते हैं बहुत आसानी से भाषा कल्पना के सभी नियमों को तोड़ने और बस वैसे भी कोड संकलन। मैं जानता हूं कि दोनों नेटबीन्स और एक्लिप्स अपने स्वयं के संकलक का उपयोग करते हैं, उदाहरण के लिए। तो उन मामलों में आईडीई और कंपाइलर समान रूप से प्रभावी हैं। यह नहीं कह रहा है कि यह एक अच्छा विचार है, लेकिन सी कंपाइलर निश्चित रूप से हर समय करते हैं।
माइकल एसआर

@MichaelS सी भाषा विनिर्देश कार्यान्वयन के बीच महत्वपूर्ण भिन्नता की अनुमति देने के लिए डिज़ाइन किया गया है, ताकि विभिन्न विक्रेता विभिन्न संभावित दृष्टिकोणों के बीच चयन कर सकें और अतिरिक्त सुविधाएँ जोड़ सकें। यह विनिर्देश में अस्पष्टता के विभिन्न क्षेत्रों का निर्माण करता है, जो उन विविधताओं को अनुमति देने के लिए आवश्यक हैं। "सी" नाम ट्रेडमार्क नहीं है, इसलिए कोई भी शब्द के उपयोग को नियंत्रित नहीं करता है। जावा विनिर्देशन को यथासंभव अधिक अस्पष्टता को खत्म करने के लिए डिज़ाइन किया गया है, और जावा को ट्रेडमार्क किया गया है और ट्रेडमार्क धारक यह सुनिश्चित करता है कि इसका उपयोग केवल अनुरूप कार्यान्वयन में किया जा सकता है।
जूल्स

आधुनिक आईडीई को वैसे भी एक कंपाइलर की आवश्यकता है। कोड पूरा होने के संकेत की आवश्यकता है कि कर्सर को पार्स करने से पहले कोड। और निश्चित रूप से जेनेरिक (या सी ++ टेम्पलेट) के साथ, जो एक पूर्ण संकलक की आवश्यकता है, न कि केवल एक पार्सर।
MSalters

3

यह Object.clone पद्धति के प्रकार के हस्ताक्षर के कारण है। प्रकार हस्ताक्षर बताता है कि विधि प्रकार की वस्तु को वापस कर देगी।

protected Object clone() throws CloneNotSupportedException

संग्रह स्वचालित रूप से कास्टिंग के प्रकार को प्रतिस्थापित करने के लिए तथाकथित सामान्य प्रकार का उपयोग करेगा।

तो अगर आपके पास यह कोड है:

List<Integer> ints = Arrays.asList(1,2,3);
int x = ints.get(0);`

कंपाइलर पर्दे के पीछे से आपके लिए कास्ट जोड़ देगा, इसलिए कोड वास्तव में होगा:

List ints = Arrays.asList(1,2,3);
int x = (Integer)ints.get(0);

0

पूर्णता के लिए, जावा 5 के बाद से, सहवर्ती रिटर्न प्रकारों की अनुमति है । तो आप निम्नलिखित लिख सकते हैं:

public MyObject implements Cloneable {
  @Override
  public MyObject clone() {
    try {
      return (MyObject)super.clone();
    } catch (CloneNotSupportedException e) {
      throw new AssertionError();
    }
  }
}

इसके साथ, निम्न कोड कानूनी है:

MyObject original = new MyObject();
MyObject clone = original.clone();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.