Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

IteratorパターンのAggregateクラスについて

Itetatorパターンを勉強しています。クラス図をみると下記が必要とあります。
Itetatorインタフェースとそれを実装するItetatorクラス
Aggregateインタフェースとそれを実装するAggregateクラス

Itetatorパターンを組み込んだプログラムでAggregateインタフェースがないものがあるのですが、
Aggregateインタフェースはなくても問題ないものなのでしょうか?

クラスは下記のものがあります。
Java Interface (Itatetor Interface )
Java Enumeration
Java Class (Itatetor)
Java Class (Aggregate)
Java Class (main)

よろしくお願いいたします。

7

回答

6247

閲覧

7件の回答

評価

0

>Itetatorパターンを組み込んだプログラムでAggregateインタフェースがない
そのままの名前のI/Fは、標準ライブラリにはないが…。

Iterableのことなら、これは1.5でfor-eachのために独立して定義されたもので、1.4以前はCollectionがまとめて受け持っていたということだろう。

#iterator()がないという意味なら、どのクラスのことか分からないが、列挙は想定してないんだろう。

評価

0

回答ありがとうございます。
質問欄にItetatorと記載していましたが、申し訳ありません、すべてIteratorのスペルミスです。
本当に申し訳ありません。

インターフェイスの実装は、implements Iterator とあります。Iterableではありません。
初心者のため、わからない点が多く、質問に必要情報が足りない部分や
わからない点をうまく伝えられない部分も多いとは思うのですが、よろしくご回答お願いいたします。

今勉強中のパターンは下記リンクのものです。
https://github.com/iluwatar/java-design-patterns/tree/master/iterator

評価

0

Iteratorパターンは結城浩さんの「Java言語で学ぶデザインパターン入門」で勉強しているのですが、
IT専科さんのページの解説が似ており、同時に勉強しています。
また、WikipediaのIteratorパターンのクラス図にもAggregateインタフェースがあり、
Aggregateインタフェースの必要性で混乱しております。

IT専科さんのIteratorパターン
http://www.itsenka.com/contents/development/designpattern/iterator.html

評価

0

ん?だから(少なくとも現行Javaで言う)Iterableのことじゃないのか?ということだったんだが。
所謂GoFに出て来る名前じゃないとだめなのか?

評価

0

すみません、まったくの初心者でよくわかっていないので、
Iterableのことを調べてみましたが、今回勉強しているプログラム内では拡張forは使っておらず、
Iterableのことではないと思うのですが、違っていたらすみません。

本によると
Iteratorを使うために、Iteratorインターフェイスを実装するクラスと
Iteratorを作り出すインタフェース(Aggregateインタフェーイス)が必要で

Iteratorを作り出すインタフェースには↓が定義しています。
-------------------------------------------
public interface Aggregate {
    public abstract Iterator iterator();
}
-------------------------------------------
Iteratorを実装するクラス(Blockクラス)には、Aggregate インタフェースを実装しており、
Aggregate インタフェースで宣言されていたiteratorメソッドの実体が書かれています。
-------------------------------------------
public class Block implements Aggregate {
    private Member[] members;
    private int last = 0;
    public Block(int maxsize) {
        this.members = new Member[maxsize];
    }
    public Member getMemberAt(int index) {
        return members[index];
    }

    public void listMember(Member member) {
        this.members[last] = member;
        System.out.println("-------");
        System.out.println(last);
        System.out.println(this.members[last]);
        System.out.println("-------");
        last ++ ;
    }
    public int getLengrh() {
        return last;
    }
    public Iterator iterator() {
        return new BlockIterator(this);
    }
}
-------------------------------------------
Blockクラスの一行目を public class Block  { に修正し、
Aggregate インタフェースを実装せずに実行したところ
プログラムは問題なくコンパイルされ、実行されたのですが、

Aggregate インタフェースを定義してBlockクラスでインタフェースし、
Iteratorを実装する場合と、

Aggregate インタフェースを定義せずIteratorを実装する場合では
どういう風に違うのでしょうか?

「Iteratorを作り出すインタフェース」の定義がよくわかっておらず、
勉強不足な点も多く、申し訳ありませんが、よろしくお願いいたします。


評価

0

デザインパターンにこだわり過ぎている…いや、惑わされている。
デザインパターンは、オブジェクト指向を理解していないのなら、はっきり言えば猫に小判だ。毒になると言ってもいい。
implementsする場合、しない場合の違いは、デザインパターンとは直接関係がない話だ。

悪いことは言わないから、デザインパターンはひとまず忘れて、オブジェクト指向そのものと、それがJavaでどう取り入れられているのか、から勉強する方がいい。

評価

0

ありがとうございます。おっしゃる通りだと思います。
出直して一からしっかり学び直しながら進みたいと思います。
ありがとうございました。


質問から6ヶ月以上経過しているので、回答を書き込むことはできません。