2011-10-07 22 views
5

चलें कहते हैं कि मैं निम्नलिखित कोड है:क्या लूप के "हालत" को इटरबेल के लिए हर बार बुलाया जाता है?

for (Object obj : Node.getIterable()) { 
    //Do something to object here 
} 

और Node.getIterable() एक iterable देता है। क्या getIterable() फ़ंक्शन हर बार या केवल लूप शुरू होने पर ही कॉल किया जाता है? क्या मुझे इसे बदलना चाहिए:

Iterable<Object> iterable = new Iterable<Object>(); 
//populate iterable with objects 
for (Object obj : iterable) { 
    //Do something 
} 
+4

पता लगाने का आसान तरीका ... बस एक विधि में Node.getIterable को लपेटें जो कंसोल में कुछ लिखता है (या यदि आप चाहें तो फ़ाइल)। फिर आप देख पाएंगे कि इसे कितनी बार बुलाया गया था। मेरी शर्त - इसे केवल एक बार बुलाया जाता है, लेकिन मुझे निश्चित जवाब देने के लिए पर्याप्त विश्वास नहीं है। –

उत्तर

11

जावा भाषा विशिष्टता विवरण बिल्कुल बताता है कि पूर्वानुमान विवरण क्या करता है। अधिक जानकारी के लिए "14.14.2 कथन के लिए बढ़ाया गया" देखें (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.2)। लेकिन संक्षेप में, वास्तव में भाषा गारंटी देता है कि जिस अभिव्यक्ति पर आप पुनरावृत्ति कर रहे हैं, उसका मूल्यांकन केवल एक बार किया जाएगा।

3

नहीं, ऐसा नहीं है। यह स्मृति में getIterable() से प्राप्त होने वाली पुनरावर्तनीय वस्तु को रखता है और उस संदर्भ का उपयोग करता है। चेक करने का त्वरित तरीका for कथन पर ब्रेक पॉइंट डालना है और जेडीके में अपना रास्ता डीबग करना है। आपको पता चल जाएगा।