List<Integer>型の変数listがあるとします。
Java
1for(int e: list) {
2 ...
3}
上記のコードは、次のように書いているのと同じです。
Java
1Iterator<Integer> it = list.iterator();
2while(it.hasNext()) {
3 int e = it.next();
4 ...
5}
これ、まさにIteratorパターンですよね?
実装者がいちいちイテレータを呼んでいては面倒なので、内部で処理されているだけです。
Iteratorパターンを学んだことで、ArrayListのiteratorの動き自体への理解は深まりましたが、
現実のプロジェクトにどう当てはめれば良いのだろうと、疑問が残りました。
直接的に役立つことはまず無いでしょう。
ただし、仕組みを知ることは大切です。これは何にでも言えることですが。
実験
MyList#iteratorを明示的に呼び出していないのがミソです。
Java
1import java.util.*;
2
3class MyList extends ArrayList<Integer> {
4 MyList(List<Integer> arg) {
5 super(arg);
6 }
7
8 @Override
9 public Iterator<Integer> iterator() {
10 System.out.println("イテレータが作られてるよ!");
11 return super.iterator();
12 }
13}
14
15
16class Main {
17 public static void main(String[] args) {
18 List<Integer> list = new MyList(List.of(3, 1, 4));
19 for(int e: list) {
20 System.out.println(e);
21 }
22 }
23}
実行結果 Wandbox
参考
The enhanced for statement is equivalent to a basic for statement of the form:
for (I #i = Expression.iterator(); #i.hasNext(); ) {
{VariableModifier} TargetType Identifier =
(TargetType) #i.next();
Statement
}
#i
is an automatically generated identifier that is distinct from any other identifiers (automatically generated or otherwise) that are in scope (§6.3) at the point where the enhanced for statement occurs.
引用元:Java Language Specification - The enhanced for statement
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。