(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Iteratorパターンを書いてて思ったこと

結城浩(@)さんの「増補改訂版 Java言語で学ぶデザインパターン入門」の中からIteratorパターンを書いてて思ったことを少しだけ。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

書籍の中で、Iteratorインターフェースを実装するシーンがあって、java.util.Iteratorじゃなくて"オレオレIteratorインターフェース"を実装している風だった*1んですけど、普通はJava言語標準ライブラリのIterator使うだろうということで実装していたら以下の様なことが気になったわけです。

まぁIteratorインターフェースを実装するときに、とりあえずhasNextメソッドとnextメソッドはいるだろう。
でも、removeメソッドが必要ないときってどうやって実装したらいいのかなぁと。でTwitterに投げたら@さんが早速返事をくれました。

確かにオレオレインターフェースだと拡張for文が使えなくなっちゃうんですよね。(Java5からだったと思いますけど、普段使わないので…)
で、removeメソッドがいらないときは実装側で以下のように書けば気にしなくて良くなるらしいです。素敵!

@Override
public void remove(){
    throw new UnsupportedOperationException();
}


あと皆、結構Iteratorインターフェースにはremoveメソッド(゚⊿゚)イラネって思うらしいです。。。


結城浩(@)さんのデザパタ本がJava5に対応してくれたら…。
本質を勉強するには今のままで十分なんですけど、Javaの仕様が変わってきてるのでより良い感じにしてもらえると助かるなぁとか。
Java5からはAggregateインターフェースを作らなくても、IterableインターフェースをConcreteAggregateで実装した方がより良いと思うんですよねー*2

そういうの含めて僕はまだまだ勉強不足だなと感じました。

*1:書籍ではremoveメソッドがなかった

*2:たぶん。間違ってたらごめんなさい。