जावा के Iterator और ListIterator तत्वों के बीच बिंदु क्यों हैं?


9

ListIterator के लिए जावाडोक का कहना है:

A ListIteratorका कोई वर्तमान तत्व नहीं है; इसकी कर्सर स्थिति हमेशा उस तत्व के बीच स्थित होती है जिसे एक कॉल द्वारा वापस किया जाएगा previous()और वह तत्व जिसे कॉल द्वारा लौटाया जाएगा next()

जावा ListIteratorको वर्तमान तत्व के बजाय तत्वों के बीच इंगित करने के लिए क्यों लागू किया गया था ? ऐसा लगता है कि इस ग्राहक कोड कम पठनीय बनाता है जब यह बार-बार फोन करने के लिए है getNext(), getPrevious()है, इसलिए मुझे लगता है चुनाव के लिए एक अच्छा कारण नहीं होना चाहिए।

एक साइड नोट के रूप में, मैंने बस एक छोटी सी लाइब्रेरी लिखी, जिसे पीक-एबिलिबल कहा जाता है ArrayList, जो फैली हुई है Iterator, और ListIteratorजो ए peekAtNext()और peekAtPrevious()तरीकों को लागू करती है जैसे:

  @Override public synchronized T peekAtNext() {
     T t = next();
     previous();
     return t;
  }

2
अमरूद लाइब्रेरी कोड में एक आकर्षक यात्रा कार्यक्रम है। Googlep /
guava-

धन्यवाद केविन! मैंने SO पर इस बारे में एक अनुवर्ती प्रश्न पोस्ट किया: क्या पीवाकिंगआईटर के साथ अमरूद के फॉरवर्डिंगलिस्ट का उपयोग करना संभव है?
ग्लेनव्यूजेफ

जवाबों:


12

जहाँ तक मैं बता सकता हूँ, इसका कारण जावाडॉक के उस भाग में पाया जा सकता है जिसे आपने उद्धृत नहीं किया था (मेरा नीचे दिया गया जोर):

सूचियों के लिए एक पुनरावृत्ति जो प्रोग्रामर को किसी भी दिशा में सूची को पार करने की अनुमति देता है, पुनरावृत्ति के दौरान सूची को संशोधित करता है ...

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

अब सोचें कि अगर हम एक ऐसे तत्व को हटा दें जो current()इट्रेटर के लिए हो तो क्या होगा - यह मानकर कि इट्रेटर में वर्तमान तत्व की धारणा होगी? इस संदर्भ में, वर्तमान तत्व की धारणा के बिना इसे लागू करने का तरीका मेरे लिए बहुत अच्छा है - क्योंकि इस तरह, इट्रेटर को तत्वों को हटाने के बारे में चिंता करने की आवश्यकता नहीं है।


यह ध्यान रखना महत्वपूर्ण है कि javadoc को इंटरफ़ेस कार्यान्वयन के लिए थ्रेड सुरक्षित होने की आवश्यकता नहीं है।

  • इस वजह से, किसी को विभिन्न थ्रेड्स से किए गए संशोधनों के सही संचालन की उम्मीद नहीं करनी चाहिए - इसके लिए, कार्यान्वयन को जेएसआर 133 प्रति जावा मेमोरी मॉडल द्वारा निर्दिष्ट एक्सेस, गारंटी दृश्यता आदि को सिंक्रनाइज़ करने के लिए अतिरिक्त साधन प्रदान करना होगा ।

ListIterator सक्षम है, पुनरावृत्ति करते समय उसी थ्रेड से किए गए संशोधनों को संभाल रहा है। सभी पुनरावृत्तियों की तरह नहीं है, समवर्तीमॉडिफिकेशन अपवाद javadocs विशेष रूप से इस बारे में चेतावनी देते हैं:

... ध्यान दें कि यह अपवाद हमेशा इंगित नहीं करता है कि किसी वस्तु को एक अलग धागे द्वारा समवर्ती रूप से संशोधित किया गया है। यदि एकल थ्रेड किसी ऑब्जेक्ट के अनुबंध का उल्लंघन करने वाले विधि इनवोकेशन का अनुक्रम जारी करता है, तो ऑब्जेक्ट इस अपवाद को फेंक सकता है। उदाहरण के लिए, यदि कोई थ्रेड सीधे संग्रह को संशोधित करता है, जबकि यह संग्रह में विफल-तेज़ पुनरावृत्ति के साथ पुनरावृत्ति करता है, तो पुनरावृत्तिकर्ता इस अपवाद को फेंक देगा ...


1
इसका मतलब यह भी है कि आपको एक अलग insertBeforeऔर की जरूरत नहीं है insertAfter, हालाँकि यह उतना बड़ा मुद्दा नहीं है remove
कार्ल बेवेलफेल्ट

1
तो क्या यह मुद्दा है कि कोई वर्तमान तत्व को समवर्ती रूप से हटा और उपयोग कर सकता है? क्या समवर्ती कॉल के रूप में यह समतुल्य मुद्दा नहीं होगा next()? remove()होगा synchronizedके रूप में getCurrent()। क्या मैं कुछ भूल रहा हूँ?
Glenviewjeff

@glenviewjeff यह एक बहुत अच्छा अवलोकन है। मुझे यह भी आश्चर्य है कि सीएमई को वहां कैसे संभाला जा सकता है - संशोधनों के लिए अनुमति देने के लिए कहा गया इरादा बहुत चिंताजनक है। लगता है कि मुझे गहरी खुदाई करने की आवश्यकता है। मैं 99.99% सुनिश्चित हूं कि यह थ्रेड सेफ के रूप में अभिप्रेत नहीं है, हो सकता है कि यह केवल एक ही थ्रेड से किए गए समवर्ती मॉड्स को संभाल सके (सभी पुनरावृत्तियों इसके लिए सक्षम नहीं हैं, आप जानते हैं)
gnat

यदि आप रुचि रखते हैं, तो मेरा संपादन देखें। मैंने ArrayListइसे पूरा करने के लिए एक विस्तार लागू किया और पैक किया ।
Glenviewjeff

@glenviewjeff दिलचस्प है। आपके कार्यान्वयन में, अगले () और पिछले () भी समन्वयन हैं? मैं पूछता हूं क्योंकि यदि नहीं, तो अन्य धागा आपके वर्तमान () के बीच में कुछ अप्रत्याशित चाल को "ड्रिल" कर सकता है, जिससे यह व्यवहार नहीं होगा कि ग्राहक बहुत उम्मीद करेंगे ... ऐड्स जैसे तरीके () शायद सिंक की आवश्यकता होगी,
gnat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.