2010-03-12 13 views
10

मेरी जावा आवेदन में मैं इसप्रतिलिपि बनाने वालों में किसी अन्य वस्तु के निजी क्षेत्र की पहुंच - वास्तव में एक समस्या है?

public MyClass(MyClass src) { 
    this.field1 = src.field1; 
    this.field2 = src.field2; 
    this.field3 = src.field3; 
... 
} 

अब Netbeans 6.9 इस बारे में चेतावनी दी है जैसे कुछ कॉपी-कंस्ट्रक्टर्स है और मुझे आश्चर्य है कि क्या इस कोड के साथ गलत क्या है?

मेरे चिंताओं:

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

संपादित करें: वास्तविक चेतावनी और ही उपलब्ध कार्रवाई Netbeans प्रदान करता है एक @SuppressWarnings("AccessingNonPublicFieldOfAnotherObject")

मेरे कोड जोड़ रहा है "एक और वस्तु की निजी क्षेत्र की पहुँच" है वास्तव में दिए गए उदाहरण के रूप में के रूप में तुच्छ है।

+0

नेटबीन्स से चेतावनी क्या है? – Timothy

+0

मेरा प्रश्न –

+1

अपडेट किया गया है, मैं केवल कारण पर अनुमान लगा सकता हूं: कुछ लोग सोचते हैं कि 'निजी' का अर्थ है कि केवल वर्तमान * ऑब्जेक्ट * फ़ील्ड तक पहुंच सकता है (जबकि वास्तव में उसी वर्ग की अन्य वस्तुएं भी क्षेत्र तक पहुंच सकती हैं)। हो सकता है कि यह चेतावनी एक अनुस्मारक के रूप में है कि यह वास्तव में संभव है और लोगों को गलती से ऐसा करने से रोकने के लिए। –

उत्तर

7

मुझे कोड के साथ कोई समस्या नहीं दिख रही है। वास्तव में, मैं आपकी चिंताओं को साझा करता हूं और गेटर्स का उपयोग नहीं करना पसंद करूंगा।

आपको क्या चेतावनी मिलती है? हो सकता है कि यह उस चीज़ से संबंधित है जिसे आप हमें नहीं दिखा रहे हैं?

अपडेट: लगता है कि नेटबीन्स वास्तव में इसके बारे में शिकायत कर रहा है। एक आईडीई के साथ जहाज के लिए यह एक विवादास्पद चेतावनी है, मुझे लगता है।

+4

बिल्कुल। मेरे विचार में निजी की अवधारणा * कक्षा कार्यान्वयन * के लिए निजी है। एक कॉपी कन्स्ट्रक्टर कक्षा कार्यान्वयन का हिस्सा है और यह निजी डेटा के साथ क्या पसंद कर सकता है। –

+0

ऐसी प्रतिलिपि एक समस्या है यदि फ़ील्ड आदिम नहीं हैं, लेकिन जिन क्षेत्रों में सामग्री बदल सकती है। भले ही वह चाहता था कि आप अभी भी सहमति प्राप्त कर सकें। – extraneon

+0

@extraneon: यह चेतावनी के दायरे से बाहर प्रतीत होता है। गेटर्स में चीजों को लपेटना भी वहां कोई फर्क नहीं पड़ता है। – Thilo

0

शायद कक्षा एक उथली प्रतिलिपि विधि प्रदान कर सकती है जो जानता है कि कॉपी किए गए ऑब्जेक्ट में कौन सा डेटा वापस आना है। यदि आवश्यक हो, तो आप भी एक गहरी प्रतिलिपि प्रदान कर सकते हैं।

public MyClass shallowCopy() { 
    MyClass aCopy = new MyClass(); 
    aCopy.field1 = this.field1; 
    aCopy.field2 = this.field2; 
    aCopy.field3 = this.field3; 
} 
+0

यह वही चेतावनी देता है। –

4

मुझे नहीं पता कि नेटबीन चेतावनी क्यों देते हैं, लेकिन आप प्रभावी रूप से उथले प्रतिलिपि बना रहे हैं। आपकी प्रतिलिपि फ़ील्ड 1, फ़ील्ड 2 और फ़ील्ड 3 को स्रोत के साथ साझा करती है और फ़ील्ड 3 के इस तरह के संशोधन के रूप में, एक सूची, मूल में प्रतिबिंबित होगी।

private List field1; 

public MyClass(MyClass src) { 
    this.field1 = src.field1; 
    this.field2 = src.field2; 
    this.field3 = src.field3; 

    field1.add(new Object()); // field1 of src also modified 
... 
} 
+0

अच्छा बिंदु, मैंने म्यूटेबल प्रकारों के बारे में नहीं सोचा था। लेकिन इस मामले में मैं केवल 'int' और' स्ट्रिंग 'प्रकारों की प्रतिलिपि बना रहा हूं –

6

यह मुझे चर्चा एडीटी बनाम वस्तु की याद दिलाता है।

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

यह एक विचार-विमर्श किया चुनाव हो गया है उदाहरणों जावा में चर हैं कि वर्ग-निजी, वस्तु-निजी (बाद में मामले में केवल this.privateInstVar अनुमति दी है, नहीं obj.privateInstVar) नहीं।

इसमें शक्ति और कमजोरियां हैं। यह क्लोनिंग और समानता पर आने पर यह आसान रूप से आसान है। दूसरी ओर इसका दुरुपयोग किया जा सकता है और ब्रेक encapsulation

यह लगभग एक दार्शनिक बहस है। लेकिन आईएमएचओ, आप क्या कर रहे हैं ठीक है।

संबंधित मुद्दे

 संबंधित मुद्दे