Java.use(better); Episode#01 拡張可能な for 文(1)
□ 制御メソッドとポリモフィズム
同様に、Iterable に準拠する、新たなクラスを用意します。
class ExFile extends File implements Iterable{ private List seq; public ExFile(String pathname) { super(pathname); seq = Arrays.asList(list()); } public Iterator iterator() { return seq.iterator(); } }
ここでは、メソッド iterator を実現するときに、既存の seq.iterator を再利用できます。
これで、ポリモフィズムを実践する準備が整いました。
for (Object seq: new Object { Arrays.asList(new String { "AB","C","DEF" }), new ExTokenizer("This is a pen."), new ExFile("bin/apple/lang") }) { System.out.println(">>> "+seq.getClass().getName()); for (String e: (Iterable)seq) { System.out.println(e); ... } }
拡張 for 文の対象 seq には、インターフェース Iterable に準拠する「任意のオブジェクト」を指定できます。このとき、任意の seq に対して for ブロックにあるコードの断片は有効です。これを Scala で表現すると、
seq.foreach { e => println(e); ... }
制御メソッド foreach は、seq の種別に依存しないので「ポリモフィズム」を体現しているのが分ります。
前述したものを実行すると、次の結果が得られます。
$ java apple.pie._Tips >>> java.util.Arrays$ArrayList AB C DEF >>> apple.pie.ExTokenizer This is a pen. >>> apple.pie.ExFile _Tips.class App.class ExFile.class ExTokenizer$1.class ExTokenizer.class $
□ 制御メソッドと情報隠蔽
Iterable を利用するプログラマーは、各文字列を参照する手段を知りませんし、その必要もありません。というのも、これらの情報は「情報隠蔽の原則」に沿って、Iterable を提供するプログラマーだけが知っていればいいからです。その「情報」は、クラス ExTokenizer/ExFile などの本体に「隠蔽」されます。
制御メソッドを利用すると、重複するコードの断片(同じ制御構造)を何度も記述する必要がないので、コードが簡潔で見通しが良くなるだけでなく、要求仕様の変更(データ構造の改変など)にも柔軟に対処できます。
↑ TOP
update*13/01/04 2:23:29