2012-09-14 12 views
7

मैं जावा में डैग्नोड क्लास लिखने की कोशिश कर रहा हूं जिससे दो नोड्स तार्किक रूप से बराबर हैं अगर वे संदर्भ के बराबर हैं।जावा में स्मार्ट पॉइंटर्स और रेफ गिनती

C++ — विचार (मैं सी से हूँ ++) — स्मार्ट संकेत और संदर्भ गिनती उपयोग करने के लिए होगा:

  • जब एक नोड बनाई गई है, मैं अगर है कि कुछ तालिका में ढूंढ निकालेंगे नोड पहले से मौजूद है। यदि ऐसा है, तो मैं एक पॉइंटर को पुराने में वापस कर दूंगा। अन्यथा, नया नोड बनाओ।

  • अतिभारित सी ++ प्रतिलिपि निर्माणकर्ता और विनाशकर्ता की तरह तरीकों रेफरी की गिनती करना होगा, और जब एक नोड के रेफरी गिनती करने के लिए 0 चला जाता है, नोड उपर्युक्त तालिका से बेदखल कर दिया है। (सी ++ भी स्मृति को मुक्त करेगा।)

हालांकि, जावा में स्वचालित रूप से गिनती करने का कोई तरीका नहीं लगता है। मुझे टेबल से नोड को बेदखल करने के बारे में जानने के लिए फिर से गिनने की आवश्यकता होगी (ताकि यह कचरा एकत्र किया जा सके), और मैं वास्तव में प्रत्येक समारोह के प्रारंभ और अंत में node->incRef() और node->decRef() पर कॉल करना से बचना चाहता हूं।

हम जावा में यह सी ++ मुहावरे कैसे करते हैं?

उत्तर

6

जावा में, संदर्भ सर्वेक्षण और कचरा स्वचालित हैं।

लेकिन इसका मतलब यह नहीं है कि यह पूरी तरह छुपा हुआ है।

आपको ReferenceQueue की आवश्यकता है यदि आप जानना चाहते हैं कि किसी ऑब्जेक्ट को कब खराब किया जा सकता है, और शायद WeakReference यदि आप पॉइंटर्स रखना चाहते हैं जो कचरे को नहीं रोकते हैं।

मेरा सुझाव है कि आपको अपनी आवश्यकता के लिए सबसे अच्छा समाधान खोजने के लिए java.lang.ref package का विवरण देखें।

+3

जावा में संदर्भ-गणना स्वचालित नहीं है - जावा जीसी संदर्भ-गणना पर निर्भर नहीं है। –

+0

मुझे यह सुनिश्चित करने के लिए मुझे यह दोबारा दोहराने की अनुमति दें कि मैं समझता हूं। असल में मेरे पास वीक रेफरेंस की एक सारणी है और संदर्भक्यू का बिंदु तालिका से वीक रेफरेंस को बेदखल करना है जब इसे जीसीएड किया जाता है। तालिका में कमजोर होने का मतलब है कि यह अभी भी जीसीएड हो सकता है, लेकिन यदि स्टैक पर या किसी अन्य ऑब्जेक्ट में नियमित संदर्भ है तो यह जीसीडी नहीं हो सकता है। और ReferenceQueue सुनिश्चित करता है कि तालिका से बेदखल कचरा संग्रह से पहले होता है, इसलिए सब कुछ अच्छा है। –

+0

यह एक आश्चर्यजनक रूप से सुरुचिपूर्ण समाधान है! ऐसा अक्सर नहीं होता है कि मैं जावा से प्रभावित हूं। –

2

जब कोई नोड बनाया जाता है, तो आप कुछ तालिका में देखते हैं यदि वह नोड पहले से मौजूद है और यदि ऐसा है तो बस पुराने को एक पॉइंटर वापस करें, अन्यथा नया नोड बनाएं।

जावा में यह लुक-अप तंत्र बनाना मुश्किल नहीं है। बस एक फैक्टरी विधि का उपयोग करें, जो 'टेबल' की जांच करता है और यदि वह पहले से मौजूद है तो वही उदाहरण देता है। (कचरा तो यह हो सकता है एकत्र)

मैं संदर्भ तो गिनती मैं जानता हूँ कि जब मेज से एक नोड को बेदखल करने की जरूरत है कि जावा के लिए

WeakReference वर्ग है। यह आपको संदर्भ गिनती करने की अनुमति नहीं देता है, लेकिन ऑब्जेक्ट को जीसी-एड होने की अनुमति देता है जब कोई भी इसका संदर्भ नहीं देता है।

इन 2 कम्बाइन और आप

  • एक 'तालिका' WeakReference रों
  • उपयोग के साथ आबादी का निर्माण कर सकते उपलब्ध जावा Collection कार्यान्वयन करना, जिससे WeakReference रों
(उदाहरण के एक WeakHashmap के लिए) का उपयोग करता है में से एक
संबंधित मुद्दे