जावा 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
फेंक दें)?
+1 भयानक – TheBlastOne
के लिए +1 क्या आप हर बार इटेटर() को कॉल करने के लिए अपने OneShotIterable के क्षेत्र में वृद्धि नहीं कर सकते हैं, और अगर यह gte n है तो अपवाद फेंक सकता है? – sp00m
@ लुकासएडर दोह आपने इसे संपादित किया – TheBlastOne