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()
ব্যবহার করে বিচ্ছিন্ন বাইকোডটি পড়ুন 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
করে না আমাদের এই খালি লুপ শরীর সম্পর্কে সতর্ক করুন। ইন্টেলিজ আইডিইএ যদিও করে। স্বীকারোক্তিযুক্ত আমি Ellipse কম্পাইলার ব্যবহার করতে IntelliJ কনফিগার করেছি, তবে এটি কারণ না হতে পারে।