- PR -

Iteratorパターンについて

投稿者投稿内容
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 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つ同時には使えないのでしょうか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-03-25 15:56
引用:

Iterator iteA = a.iterator();
Iterator iteB = b.iterator();


a, bはおそらくDataクラスのインスタンスだと思いますが、Dataクラスのiteratorメソッド
はどのような実装になっているのでしょうか? また、Iteratorの実装には内部クラスを使う
のが常套手段です。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-03-25 16:09
逆に質問ですが、エラーとはなんでしょうか?
例外でしょうか。コンパイルエラーでしょうか?

ソースを見た限りでは、removeメソッドを実装していないので
コンパイルが通っていないように見受けられます。
独自にIteratorインターフェイスを作ったうえでの実装でしょうか?
ukさん同様Dataクラスのiteratorメソッドの実装も見ないとわかりません。

ついでに、フィールドをprotectedで宣言していますが、
privateにするべきでは?と思います。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-03-25 17:19
引用:

ダメ猫さんの書き込み (2004-03-25 15:45) より:
そこで、
Iterator iteA = a.iterator();
Iterator iteB = b.iterator();
とすると、両方ともbの中身から持ってきてしまいます。

(中略)

intIndexとdataをクラス変数として持っているためだというのはわかりますが、どのように変えたらよいのでしょうか?
それとも2つ同時には使えないのでしょうか?


intIndexとdataはクラス変数なのでしょうか?
提示されたコードにはstaticがついていないので、そうではないように
見えますが、もしかしてお手元の現物にはstaticがついていたりするのでしょうか?
もしそうなら、staticを取り除いてください。

あと、プログラムコードを載せるときは、コードタグを使ったほうが、見やすくなると思いますよ。
投稿の下のボタンを押せば、編集することができるので試してみてください。
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-03-25 17:55
皆さん返信ありがとうございます。

データクラスのiteratorメソッドは次のようになっています。
コード:
	public Iterator iterator() {        
		return new DataIterator(this);
	} // end Iterator



引用:
逆に質問ですが、エラーとはなんでしょうか?
例外でしょうか。コンパイルエラーでしょうか?

ソースを見た限りでは、removeメソッドを実装していないので
コンパイルが通っていないように見受けられます。
独自にIteratorインターフェイスを作ったうえでの実装でしょうか?
ukさん同様Dataクラスのiteratorメソッドの実装も見ないとわかりません。

ついでに、フィールドをprotectedで宣言していますが、
privateにするべきでは?と思います。


エラーとはaのデータを受け取ろうとしたのにbを受け取ってしまうために起こる実行時のエラーです。(NullPointException)
removeメソッドはあります、こちらに貼り付けてた時に誤って消してしまったようです。
protectedにしてるのはテストケースで確かめるためです。(あまり良いやり方では無いと思いますが)

引用:

intIndexとdataはクラス変数なのでしょうか?
提示されたコードにはstaticがついていないので、そうではないように
見えますが、もしかしてお手元の現物にはstaticがついていたりするのでしょうか?
もしそうなら、staticを取り除いてください。


私の勘違いですすみません。

でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-25 19:27
引用:

ダメ猫さんの書き込み (2004-03-25 17:55) より:
エラーとはaのデータを受け取ろうとしたのにbを受け取ってしまうために起こる実行時のエラーです。(NullPointException)


データクラスのインスタンスが持つ要素数を超えて next() を要求すると null を返す仕様になっていますよね。
next() を 実行する前に hasNext() で事前にチェックしているとは思うのですが、DataIterator#hasNext() か Data#getNum() に問題があった場合、やはり NullPointerException がスローされると思います。
例えば Data#getNum() が要素の最後のインデックスを返す仕様だった場合とか。
Iterator iteA = a.iterator(); で b の イテレータが返されるとの事ですが、どのようにして判断されましたか?

いずれにしても、Data クラスの実装を書き込んだ方が、回答を得られやすいと思います。

後、DataIterator#next() で、それ以上要素がない場合は NoSuchElementException を投げるのが一般的ですよ。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-03-25 20:38
引用:

ダメ猫さんの書き込み (2004-03-25 17:55) より:
データクラスのiteratorメソッドは次のようになっています。
コード:
	public Iterator iterator() {        
		return new DataIterator(this);
	} // end Iterator




これを見る限りではiteratorメソッドには問題ないようですね。だとすると、getDataあたりが
怪しいと思います。

根本的な疑問があるのですが、なんのためにこのIteratorクラスを作っているのですか?
Iteratorパターンは内部データを隠したまま内部データに順次アクセスする手段を提供する
ためのものですが、この実装を見る限りでは無意味だと思います。
#先の書き込みで書いた「内部クラスで実装するのが常套手段」なのはそのためです
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-25 23:44
私にはDataクラスが単なるリスト型のコレクションであるように見えるのですが、java.util.ArrayListあたりをそのまま使うようにして、その辺のコードを全部削除、というわけにはいかないのでしょうか。
枯れた実装があるのに同様の機能を自作するのは、エンバグの可能性を増やすだけで意味がないと思いますが…

スキルアップ/キャリアアップ(JOB@IT)