Iteratorパターンを書いてて思ったこと
結城浩(@hyuki)さんの「増補改訂版 Java言語で学ぶデザインパターン入門」の中からIteratorパターンを書いてて思ったことを少しだけ。
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (395件) を見る
書籍の中で、Iteratorインターフェースを実装するシーンがあって、java.util.Iteratorじゃなくて"オレオレIteratorインターフェース"を実装している風だった*1んですけど、普通はJava言語標準ライブラリのIterator使うだろうということで実装していたら以下の様なことが気になったわけです。
java.util.Iteratorを使わないで、Iteratorインターフェースを書くのはやっぱまずいかなー。なんか微妙。でもremoveいらね。
— あやぴー@あやろふモードさん (@ayato_p) 11月 27, 2012
まぁIteratorインターフェースを実装するときに、とりあえずhasNextメソッドとnextメソッドはいるだろう。
でも、removeメソッドが必要ないときってどうやって実装したらいいのかなぁと。でTwitterに投げたら@smogamiさんが早速返事をくれました。
@ayato_p オレオレインターフェイスだと、拡張for文で回せず、使う側がhasNext/nextやら呼び出すので手間増えません?removeはthrow new UnsupportedOperationExceptionではダメですか?
— もがみさん (@smogami) 11月 27, 2012
確かにオレオレインターフェースだと拡張for文が使えなくなっちゃうんですよね。(Java5からだったと思いますけど、普段使わないので…)
で、removeメソッドがいらないときは実装側で以下のように書けば気にしなくて良くなるらしいです。素敵!
@Override public void remove(){ throw new UnsupportedOperationException(); }
あと皆、結構Iteratorインターフェースにはremoveメソッド(゚⊿゚)イラネって思うらしいです。。。
@ayato_p AbstractListなどがこの例外使ってますよ。removeイラネは同感です。Iterator{next,hasNext}ReveseIterator{prev,hasPrev}Removable{remove}くらい分かれてると良かったのですが。
— もがみさん (@smogami) 11月 27, 2012
結城浩(@hyuki)さんのデザパタ本がJava5に対応してくれたら…。
本質を勉強するには今のままで十分なんですけど、Javaの仕様が変わってきてるのでより良い感じにしてもらえると助かるなぁとか。
Java5からはAggregateインターフェースを作らなくても、IterableインターフェースをConcreteAggregateで実装した方がより良いと思うんですよねー*2
そういうの含めて僕はまだまだ勉強不足だなと感じました。