昔やっていた恥ずかしいコーディング −繰り返し処理編−

 悪くはないのでしょうが、以前はこんなことをやっていました。

ArrayList al = new ArrayList();

al.add("abc");
al.add("def");

for (int i = 0; i < al.size(); i++) {
    System.out.println((String) al.get(i));
}

↓のほうがベターだと思います。

ArrayList al = new ArrayList();

al.add("abc");
al.add("def");

for (Iterator it = al.iterator; it.hasNext();) {
    System.out.println((String) it.next());
}

J2SE 5 なら↓のような書き方が良いと思います。

ArrayList<String> al = new ArrayList<String>();

al.add("abc");
al.add("def");

for (String s : al) {
    System.out.println(s);
}

なぜiteratorを使うのか?

 iteratorイテレータ)は、日本語で「繰り返し子」と訳されるものです。では何故これを使うのでしょうか? それは、ArrayList実装関係に由来します。ArrayListは、Listインタフェースの実装です。そして、ListはCollectionインタフェースのサブインタフェースです。Javaでは、オブジェクトの集合を扱うクラスはこのCollectionインタフェースから派生したインタフェースを実装しており、「Collectionフレームワーク」という仕様に則ってできています。
 このCollectionインタフェースには、getメソッドがありませんがiteratorメソッドがあります。なので、iteratorを使うわけです。


 「なので」って、なんで「なので」なの?となるかもしれません。それはOOPの思想から由来します。つまり

抽象的でいいものは抽象的に作ろう

ということです。スーパークラスであればスーパークラスであるほど、スーパーインタフェースであればスーパーインタフェースであるほど、仕様が抽象的と言えます。たとえば、会話において、具体的に話すのと抽象的に話すのはどちらが楽でしょうか? もちろん抽象的に話すほうが楽です。なぜなら、多少のちょんぼがあっても後で取り繕える余地が残っているからです。プログラミングも一緒です。できるだけ抽象的に作ることが仕様変更に強いプログラムになると言えると思います。