Java.use(better); Episode#01 拡張可能な for 文(1)

前の記事次の記事
Java.use(better);


Episode#01

拡張可能な for 文(1) -- for と別れる50の方法



《関連記事》

□ 制御メソッドとポリモフィズム

同様に、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