Javac語法糖之增強for循環
阿新 • • 發佈:2017-08-19
數組 spa blog 增強for fresh where type local get
加強的for循環有兩種,遍歷數組和實現了Iterable接口的容器。javac通過visitForeachLoop()方法來實現解語法糖,代碼如下:
/** Translate away the foreach loop. */ public void visitForeachLoop(JCEnhancedForLoop tree) { if (types.elemtype(tree.expr.type) == null) visitIterableForeachLoop(tree); else visitArrayForeachLoop(tree); }
首先來看遍歷數組。
A statement of the form
for ( T v : arrayexpr ) stmt;
(where arrayexpr is of an array type) gets translated to
for ( { arraytype #arr = arrayexpr; int #len = array.length; int #i = 0; }; #i < #len; i$++ ) { T v = arr$[#i]; stmt; }
where #arr, #len, and #i are freshly named synthetic local variables.
舉個例子,如下:
Integer[] array = { 1, 2, 3, 4, 5 }; for (Integer i : array) { System.out.println(i); }
解語法糖後的結果如下:
for (Integer[] arr$ = array, len$ = arr$.length, i$ = 0; i$ < len$; ++i$) { Integer i = arr$[i$]; { System.out.println(i); } }
來看看對容器的遍歷,如下:
A statement of the form
for ( T v : coll ) stmt ;
(where coll implements Iterable<? extends T>) gets translated to
for ( Iterator<? extends T> #i = coll.iterator(); #i.hasNext(); ) { T v = (T) #i.next(); stmt; }
where #i is a freshly named synthetic local variable.
List<String> list = new ArrayList<String>(); for(String str:list){ System.out.println(str); }
解語法糖後的結果如下:
for (java.util.Iterator i$ = list.iterator(); i$.hasNext(); ) { String str = (String)i$.next(); { System.out.println(str); } }
Javac語法糖之增強for循環