1 背景
java的for循環遍歷元素的方法中,有一種增強for循環(Java's enhanced for loop)。這個是Java中的一個語法糖。目的是為了讓代碼更簡潔優雅。今天我們探討一下,它背后的原理是什么?
2 原理
-
使用條件
首先,當且僅當 一個類實現了 Iterable 接口時,它才能使用該語法糖。 -
反編譯代碼
// 此處假設 MenuItem 實現了 Iterable 接口,以下是源代碼
for (MenuItem menuItem: menuItems) {
System.out.println(menuItem);
}
// 以下是上面的源代碼反編譯后的代碼
Iterator var1 = this.menuItems.iterator();
while(var1.hasNext()) {
MenuItem menuItem = (MenuItem)var1.next();
System.out.println(menuItem);
}
-
結論
看到反編譯后的代碼,一目了然,我們自然清楚了其中的原理。
其實就是在編譯時,編譯器將 該語法糖代碼 轉換為了普通語法的代碼。 -
延伸
如果一個類未實現 Iterable 接口,而對其使用該語法糖,則編譯時報錯:foreach not applicable to type 'java.lang.String'。
而我們查看 Iterable 接口的源碼,會發現其中有個 forEach() 方法,那么會不會和這個方法有關呢?
大家可以試試看,另外編寫一個接口,把 Iterable 接口中的代碼 復制過去,嘗試實現該接口,能否使用該語法糖;然后,去掉其中的 forEach() 方法,再測試能否使用該語法糖。
當然,這只是我的一個不成熟的猜想?如果你測試了,還請告訴我測試的結果。