2013-04-03 8 views
12

जावा 5 के बाद से, हम नए java.lang.Iterable प्रकार है कि इस तरह के रूप foreach छोरों में इस्तेमाल किया जा सकता है:क्या एकाधिक उपयोग के संबंध में Iterable इंटरफ़ेस के लिए कोई आधिकारिक अनुबंध है?

for (Object element : iterable); 

Iterable अनुबंध Iterable के निपटान से पहले निर्दिष्ट नहीं करता है कि क्या उसके iterator() विधि एक बार से अधिक कहा जा सकता है । यानी, यह स्पष्ट नहीं है निम्नलिखित सभी Iterables के लिए काम करने के लिए उम्मीद की जा सकती है कि क्या:

for (Object element : iterable); 
for (Object element : iterable); 

उदाहरण के लिए, एक Iterator रैपिंग कार्यान्वयन दो बार नहीं किया जा सकता:

public class OneShotIterable<T> implements Iterable<T> { 
    private final Iterator<T> it; 

    public OneShotIterable(Iterator<T> it) { 
     this.it = it; 
    } 

    @Override 
    public Iterator<T> iterator() { 
     return it; 
    } 
} 

ज्यादातर के लिए Iterables, यह है अप्रासंगिक, क्योंकि वे वास्तव में List, Set जैसे रेट्रो-फिट संग्रह एपीआई प्रकार हैं, जिनके पास पहले से ही iterator() विधियों के लिए अच्छी तरह से परिभाषित अनुबंध हैं।

मेरा प्रश्न है: क्या मेरा OneShotIterable कार्यान्वयन कुछ अनुबंध का उल्लंघन कर रहा है जिसे मैं देख रहा हूं? दूसरे शब्दों में, Iterable के उपयोगकर्ताओं को यह पुन: प्रयोज्य होने की उम्मीद है? यदि हां, क्या जावा 5 विशेषज्ञ समूह द्वारा "आधिकारिक" सिफारिश है कि इस तरह के "एक शॉट" Iterables से निपटने के लिए कैसे करें (उदाहरण के लिए दूसरी कॉल पर IllegalStateException फेंक दें)?

+2

+1 भयानक – TheBlastOne

+0

के लिए +1 क्या आप हर बार इटेटर() को कॉल करने के लिए अपने OneShotIterable के क्षेत्र में वृद्धि नहीं कर सकते हैं, और अगर यह gte n है तो अपवाद फेंक सकता है? – sp00m

+0

@ लुकासएडर दोह आपने इसे संपादित किया – TheBlastOne

उत्तर

14

मानक पुस्तकालय में मुझे मिल सकता है एक उदाहरण DirectoryStream इंटरफ़ेस है।

इसके जावाडोक निम्नलिखित मार्ग (जोर उनकी) शामिल हैं:

जबकि DirectoryStream फैली Iterable, यह एक सामान्य प्रयोजन Iterable के रूप में यह केवल एक ही Iterator का समर्थन करता है नहीं है, iterator विधि को दूसरे या बाद वाले इटरेटर प्राप्त करने के लिए IllegalStateException फेंकता है। (! शायद यह भी समवर्ती)

  • Iterable पर गर्भित अनुबंध है कि आप एक बार से अधिक पुनरावृति करने में सक्षम होना चाहिए रहे हैं
  • एक:

मेरे लिए, यह दो बातें पता चलता है बोल्डफेस प्रलेखन में IllegalStateException फेंकने के साथ-साथ आपके स्वयं के वर्ग/इंटरफेस में अनुपालन को संभालने का सबसे अच्छा तरीका है।

1

नहीं वास्तव में मेरे प्रश्न का उत्तर है, लेकिन अपाचे कॉमन्स संग्रह अपने IteratorUtils कक्षा में इस मुद्दे को संबोधित किया गया है:

दोनों IteratorIterable प्रकार के लिए कारखाने तरीके हैं । उपर्युक्त भेद यह स्पष्ट करता है कि Iterables में लपेटते समय किसी को ध्यान रखना चाहिए।

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