foreach
वैसे भी हुड के तहत पुनरावृत्तियों का उपयोग करता है। यह वास्तव में सिर्फ वाक्यात्मक चीनी है।
निम्नलिखित कार्यक्रम पर विचार करें:
import java.util.List;
import java.util.ArrayList;
public class Whatever {
private final List<Integer> list = new ArrayList<>();
public void main() {
for(Integer i : list) {
}
}
}
चलो इसे संकलित करते हैं javac Whatever.java
,
और main()
उपयोग किए गए, के disassembled bytecode को पढ़ते हैं javap -c Whatever
:
public void main();
Code:
0: aload_0
1: getfield #4 // Field list:Ljava/util/List;
4: invokeinterface #5, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
9: astore_1
10: aload_1
11: invokeinterface #6, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
16: ifeq 32
19: aload_1
20: invokeinterface #7, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
25: checkcast #8 // class java/lang/Integer
28: astore_2
29: goto 10
32: return
हम देख सकते हैं कि foreach
नीचे एक कार्यक्रम है:
- इटरेटर का उपयोग करके बनाता है
List.iterator()
- यदि
Iterator.hasNext()
: आक्रमण करता है Iterator.next()
और लूप जारी रखता है
के रूप में "क्यों यह बेकार लूप संकलित कोड से बाहर अनुकूलित नहीं किया जाता है? हम देख सकते हैं कि यह सूची आइटम के साथ कुछ भी नहीं करता है": ठीक है, यह आपके लिए संभव है कि आप अपने पुनरावृत्ति को कोड करें जैसे कि .iterator()
साइड-इफेक्ट्स , या इसलिए .hasNext()
इसके दुष्परिणाम या सार्थक परिणाम हैं।
आप आसानी से कल्पना कर सकते हैं कि एक डेटाबेस से एक स्क्रॉल करने योग्य क्वेरी का प्रतिनिधित्व करने वाला एक पुनरावृत्ति पर कुछ नाटकीय कर सकता है .hasNext()
(जैसे डेटाबेस से संपर्क करना, या कर्सर को बंद करना क्योंकि आप परिणाम सेट के अंत तक पहुंच गए हैं)।
इसलिए, भले ही हम यह साबित कर सकते हैं कि लूप बॉडी में कुछ भी नहीं होता है ... यह साबित करने के लिए कि हम सार्थक होने पर कुछ भी सार्थक / परिणामी नहीं होता है, यह साबित करने के लिए अधिक महंगा (अट्रैक्टिव) है। कंपाइलर को प्रोग्राम में इस खाली लूप बॉडी को छोड़ना पड़ता है।
सबसे अच्छा हम उम्मीद कर सकते हैं कि एक संकलक चेतावनी होगी । ऐसा नहीं है कि दिलचस्प है javac -Xlint:all Whatever.java
करता नहीं हमें इस खाली पाश शरीर के बारे में चेतावनी दी है। IntelliJ आईडिया हालांकि करता है। निश्चित रूप से मैंने ग्रहण कम्पाइलर का उपयोग करने के लिए इंटेलीज को कॉन्फ़िगर किया है, लेकिन यह कारण नहीं हो सकता है।