- - PR -
Iteratorパターンについて
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-03-25 15:45
こんにちはダメ猫です。
現在Iteratorを使っているのですが、2つのものを使うとエラーが出てしまいます。 例えば、Dataというクラスがあってaとbと言う名前でインスタンス化しました。 aとbのデータの中身や量は違うとします。 そこで、 Iterator iteA = a.iterator(); Iterator iteB = b.iterator(); とすると、両方ともbの中身から持ってきてしまいます。 Itaretorのコードはこんな感じです。 public class DataIterator implements Iterator{ protected int intIndex_; protected Data data_; public boolean hasNext() { System.out.println(intIndex_ + ":" + data_.getNum()); if(intIndex_< data_.getNum()){ return true; }else{ return false; } } public Object next(){ Object obj; try{ obj = data_.getData(intIndex_); }catch(ArrayIndexOutOfBoundsException e){ obj = null; } intIndex_ ++; return obj; } public DataIterator(Data data) { data_ = data; intIndex_ = 0; } } intIndexとdataをクラス変数として持っているためだというのはわかりますが、どのように変えたらよいのでしょうか? それとも2つ同時には使えないのでしょうか? | ||||||||||||
|
投稿日時: 2004-03-25 15:56
a, bはおそらくDataクラスのインスタンスだと思いますが、Dataクラスのiteratorメソッド はどのような実装になっているのでしょうか? また、Iteratorの実装には内部クラスを使う のが常套手段です。 | ||||||||||||
|
投稿日時: 2004-03-25 16:09
逆に質問ですが、エラーとはなんでしょうか?
例外でしょうか。コンパイルエラーでしょうか? ソースを見た限りでは、removeメソッドを実装していないので コンパイルが通っていないように見受けられます。 独自にIteratorインターフェイスを作ったうえでの実装でしょうか? ukさん同様Dataクラスのiteratorメソッドの実装も見ないとわかりません。 ついでに、フィールドをprotectedで宣言していますが、 privateにするべきでは?と思います。 | ||||||||||||
|
投稿日時: 2004-03-25 17:19
intIndexとdataはクラス変数なのでしょうか? 提示されたコードにはstaticがついていないので、そうではないように 見えますが、もしかしてお手元の現物にはstaticがついていたりするのでしょうか? もしそうなら、staticを取り除いてください。 あと、プログラムコードを載せるときは、コードタグを使ったほうが、見やすくなると思いますよ。 投稿の下の ボタンを押せば、編集することができるので試してみてください。
| ||||||||||||
|
投稿日時: 2004-03-25 17:55
皆さん返信ありがとうございます。
データクラスのiteratorメソッドは次のようになっています。
エラーとはaのデータを受け取ろうとしたのにbを受け取ってしまうために起こる実行時のエラーです。(NullPointException) removeメソッドはあります、こちらに貼り付けてた時に誤って消してしまったようです。 protectedにしてるのはテストケースで確かめるためです。(あまり良いやり方では無いと思いますが)
私の勘違いですすみません。 | ||||||||||||
|
投稿日時: 2004-03-25 19:27
データクラスのインスタンスが持つ要素数を超えて next() を要求すると null を返す仕様になっていますよね。 next() を 実行する前に hasNext() で事前にチェックしているとは思うのですが、DataIterator#hasNext() か Data#getNum() に問題があった場合、やはり NullPointerException がスローされると思います。 例えば Data#getNum() が要素の最後のインデックスを返す仕様だった場合とか。 Iterator iteA = a.iterator(); で b の イテレータが返されるとの事ですが、どのようにして判断されましたか? いずれにしても、Data クラスの実装を書き込んだ方が、回答を得られやすいと思います。 後、DataIterator#next() で、それ以上要素がない場合は NoSuchElementException を投げるのが一般的ですよ。 | ||||||||||||
|
投稿日時: 2004-03-25 20:38
これを見る限りではiteratorメソッドには問題ないようですね。だとすると、getDataあたりが 怪しいと思います。 根本的な疑問があるのですが、なんのためにこのIteratorクラスを作っているのですか? Iteratorパターンは内部データを隠したまま内部データに順次アクセスする手段を提供する ためのものですが、この実装を見る限りでは無意味だと思います。 #先の書き込みで書いた「内部クラスで実装するのが常套手段」なのはそのためです | ||||||||||||
|
投稿日時: 2004-03-25 23:44
私にはDataクラスが単なるリスト型のコレクションであるように見えるのですが、java.util.ArrayListあたりをそのまま使うようにして、その辺のコードを全部削除、というわけにはいかないのでしょうか。
枯れた実装があるのに同様の機能を自作するのは、エンバグの可能性を増やすだけで意味がないと思いますが… | ||||||||||||

ボタンを押せば、編集することができるので試してみてください。