2015-06-22 8 views
7

मैं वर्तमान में जावा के लिए ग्राफ लाइब्रेरी पर काम कर रहा हूं। जैसा कि आप उम्मीद करते हैं कि Vertex कक्षा मौजूद है। उस वर्ग में VertexData<T> प्रकार का ऑब्जेक्ट होता है और इसमें स्वयं कुछ भी हो सकता है।
(मुझे पता है कि यह अनावश्यक हो सकता है और मैं केवल Vertex<T> कर सकता हूं लेकिन सवाल के उद्देश्य से इससे कोई फर्क नहीं पड़ता)।
मैं VertexData<T>Cloneable को लागू करने और serializing और बुला Object deserializing, द्वारा एक गहरी प्रतिलिपि लौटने एक public VertexData<T> clone() विधि काफी की तरह वर्णित hereउथली प्रतिलिपि वास्तव में आवश्यक है?

अब सवाल है, के बाद से मैं एक गहरी प्रतिलिपि विधि है, यह पड़ता है है बनाया एक उथली प्रतिलिपि भी समझने के लिए? यदि ऐसा है तो एक मामला क्या है कि एक गहरी प्रतिलिपि पर एक उथली प्रति को प्राथमिकता दी जाएगी?

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

मैं यहां भी जोड़ दूंगा कि VertexData<T> कक्षा में कोई आदिम प्रकार नहीं है।
तो ग्राफ़ लाइब्रेरी के लिए वेरटेक्स डेटा स्टोर करने के लिए उपयोग किए जाने वाले कंटेनर क्लास के संदर्भ में, क्या एक उथली प्रतिलिपि की आवश्यकता होगी?
यदि आप विकास के विकास के संदर्भ में एक उदाहरण के बारे में सोच सकते हैं?
अगर मुझे पूर्णता के लिए केवल एक उथली प्रति विधि नहीं जोड़नी चाहिए?
क्या यह एक अच्छा अभ्यास है या इससे कोई फर्क नहीं पड़ता?

+4

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

+0

यह स्थितिगत है। शालो प्रतिलिपि का मतलब आमतौर पर किसी ऑब्जेक्ट के केवल एक स्तर की प्रतिलिपि बनाना होता है, जबकि गहरी प्रतिलिपि का अर्थ आम तौर पर कई स्तरों पर सब कुछ कॉपी करना है। – Adam

+0

यदि आप अपरिवर्तनीय वस्तुओं का संदर्भ देते हैं तो आम तौर पर आप उथले प्रतियां बनाते हैं, लेकिन यह केवल एक उदाहरण है, नियम नहीं। – biziclop

उत्तर

1

List<Point> की तरह एक कंटेनर प्रकार कुछ मामलों में करने के लिए इस्तेमाल किया जा सकता है पकड़ एक्स का एक समूह, वाई जोड़े समन्वय, लेकिन अन्य मामलों करने के लिए इस्तेमाल किया जा सकता है में चल अंक का एक समूह है जो अन्य कोड द्वारा किया जाता है की पहचान । पूर्व मामले को उप-मामलों में विभाजित किया जा सकता है जहां List<Point> का मालिक Point उदाहरणों का विशेष मालिक भी है और उन्हें इच्छानुसार संशोधित कर सकता है, या जहां मालिक उन उदाहरणों को कभी भी संशोधित नहीं करेगा, लेकिन उन वादे को कोड के साथ संदर्भ साझा कर सकता है जो वादे करता है उन्हें संशोधित न करें।

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

List<Point>लिए कार्य करता है तो पहचानPoint उदाहरण हैं जिनमें अन्य कोड संशोधित कर सकता है, और किसी भी तरह के संशोधन ही List<Point> में परिलक्षित होने की जरूरत है, तो एक उचित क्लोन रूप में एक ही Point वस्तुओं के लिए संदर्भ होने चाहिए जिसे मूल सूची। यदि क्लोन को Point ऑब्जेक्ट्स की प्रतियों को प्रतिस्थापित करना था, तो यह मूल सूची के समान वही अर्थपूर्ण जानकारी नहीं रखेगा।

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

0

आपको एक उथली प्रतिलिपि की आवश्यकता नहीं होगी। एक उथली प्रतिलिपि केवल आपके पहले से मौजूद ऑब्जेक्ट में स्मृति में एक नया संदर्भ चर निर्दिष्ट करेगी। एक '=' ऑपरेटर काम करेगा। अधिक जानकारी के लिए, कृपया इस पोस्ट के माध्यम से जाएं - In Java, what is a shallow copy?

+1

एहम। मुझे पता है कि एक उथली प्रति क्या है। मेरा सवाल इस तरह से था क्योंकि मैं लाइब्रेरी पर काम कर रहा हूं, अगर यह एक उथली प्रतिलिपि भी समझ में आता है। यदि गहरी प्रति उपलब्ध हो तो क्या उस चीज़ की आवश्यकता होगी। – qbit

+3

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

+0

नहीं। जो भी आपकी लाइब्रेरी का उपयोग कर रहा है, वह ऐसा करने के लिए '=' ऑपरेटर का उपयोग करेगा। आपको इसे प्रदान नहीं करना पड़ेगा। एक उथली प्रतिलिपि केवल तभी पसंद की जाएगी जब कोई स्मृति संदर्भ रखने के लिए कोई नया संदर्भ चर चाहता है। हालांकि, अगर आप चाहते हैं, तो आप सार्वजनिक क्लासनाम नामक एक नई विधि प्रदान कर सकते हैं, उथोपी() {वापसी नया क्लासनाम(); // अधिक सामान;} यदि आप उथले प्रतिलिपि के साथ कुछ और सामान करना चाहते हैं, लेकिन आप '=' ऑपरेटर का उपयोग करने के लिए अपनी लाइब्रेरी के उपयोगकर्ताओं को प्रतिबंधित नहीं कर सकते हैं। –

3

यह वास्तव में आवश्यकताओं के लिए आता है। अपने ऑब्जेक्ट को जानना अकेले आदिम क्षेत्रों से अधिक है, इसे (और धन्यवादपूर्वक) deep copy होना चाहिए। shallow या deep का उपयोग करने के साथ कोई "कठोर और तेज़ नियम" नहीं है। चूंकि यह "आवश्यकता के आधार पर" है, इसलिए यह एक अन्य उत्तर में टिप्पणी में @RyanJ अंक दोनों प्रदान करना सुरक्षित होगा।

यदि आप अपने संग्रह या ऑब्जेक्ट को प्रतिलिपि बनाना चाहते हैं, और एक विशेषता में परिवर्तन करना चाहते हैं, तो यह संदर्भ और कॉपी ऑब्जेक्ट दोनों को बदल देगा। दूसरी तरफ, यदि आप गहरी प्रतिलिपि बनाना चाहते हैं और किसी ऑब्जेक्ट के मूल्य या ऑब्जेक्ट की प्रतिलिपि बदलने में सक्षम होना चाहते हैं और यह प्रतिलिपि और मूल दोनों को प्रभावित नहीं करता है, तो आपको गहरी प्रतिलिपि की आवश्यकता होती है। यह सब आवश्यकता के लिए आता है और आपको अपनी वस्तु/प्रणाली को क्या करने की आवश्यकता है। मेरी अंतिम सिफारिश दोनों करना है।

0

हां यह कुछ मामलों में आवश्यक है। आप निम्नलिखित बिंदुओं के आधार पर आवश्यकता का अनुमान लगा सकते हैं।

यदि ऑब्जेक्ट में केवल आदिम फ़ील्ड हैं, तो आपको उथली प्रतिलिपि के लिए जाना चाहिए।

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

यदि संदर्भ संशोधित नहीं हैं तो इसकी गहरी प्रतिलिपि करने की आवश्यकता नहीं है। यहां आपको उथले प्रतिलिपि के लिए जाना चाहिए।

यदि संदर्भ संशोधित हैं तो गहरी प्रति को प्राथमिकता दी जाती है।

उथले प्रतिलिपि:

enter image description here

उथले प्रति मूल्यों के तत्वों अन्य संदर्भ से बदल रहे हैं, तो अवांछित प्रभाव हो सकता है।

गहरी प्रतिलिपि:

enter image description here

गहरी प्रतिलिपि दौरान सरणी मूल्यों में कोई परिवर्तन परिवर्तन का कारण नहीं बनेगा करने के लिए सरणी डेटा को संदर्भित करता है संदर्भित करता है।

उदाहरण के साथ इस बारे में अधिक समझने के लिए आप this link देख सकते हैं।

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