11

Iterable<E>にありjava.langますIterator<E>が、にありjava.utilます。これには正当な理由がありますか、それともこれは単に悪いデザインのアーティファクトですか?

Iterable<E>が良いのはを提供することだけなので、奇妙に思えIterator<E>ます。

編集:1つの潜在的な理由は、(その後)新しく導入されたfor-eachループのためです。私の質問は、それらは同等ですか?

for(Object o : collection)
    ...
vs
for( Iterator iter = collection.iterator(); iter.hasNext(); ) {
    o = iter.next();
    ...

もしそうなら、コンパイラが構造java.utilを使用するためにとにかくインポートしなければならないので、それでも2つのクラスが異なるパッケージにある理由を説明していませんIterator

4

5 に答える 5

11

その一部は歴史です。JDK1.2Iteratorから使用されており、JDK1.5Iterable付属しています。 強化されたループが付属しています。Iterablefor

悪いデザイン?いいえ、進化です。全知のクリエーターはいない。レッスンが学習されると、それらはJDKに組み込まれます。

于 2011-08-02T01:14:46.633 に答える
8

java.lang言語機能の依存関係であるクラス用に予約されています。 Iterablefor-eachループを介して直接言語レベルのサポートがありますが、Iteratorそうではありません。

于 2011-08-02T01:06:01.050 に答える
5

ほとんどのコレクションIterableは、便利なforループ構文を使用できるように実装されています。

Iterable<T> someIterableThing;
for (T x : someIterableThing) { ... }

これは、Java言語の機能であるこの構文に強く関連しているためだとIterable思います。java.lang

于 2011-08-02T01:06:55.907 に答える
2

時間の経過とともに、Javaのjava.*サブパッケージはさまざまな循環依存関係を発展させてきました。例えば、

  1. java.lang.Process-java.io
  2. java.lang.Readable-java.io、java.nio
  3. java.lang.String-java.util
  4. java.lang.System-java.io、java.nio、java.util

したがって、依存関係を明確に階層化するメカニズムとしてサブパッケージを考えないことが最善だと思います。むしろ、サブパッケージは、関連する特殊な動作(catch-allを除くutil)をグループ化し、やなどlangの非常に便利な構造を選択的に取り込みIteratorますLocale

エントロピーまですべてをチョークすることもできると思います。

于 2011-08-02T02:57:24.407 に答える
2

追加の質問に答えるには:

拡張されたforループには2つのバリエーションがあります。それらの1つcollection

for(E o : collection) {
    ...
}

を実装するものでありIterable<E>、正確に同等です

for (Iterator<E> iter = collection.iterator(); iter.hasNext(); ) {
    E o = iter.next();
    ...
}

(イテレーターには、ループの残りの部分でアクセスできる変数名がないという違いがあります)。コンパイラーは、バージョンごとに非常に類似した、またはまったく同じコードを生成します。

拡張forループには別のバリエーションがあります。collectionが配列の場合、次のようにコンパイルされます。

E[] a = collection;
for(int i = 0; i < a.length; i++) {
    E o = a[i];
    ...
}

(もちろん、ここでは直接アクセスすることもできませai。)

ちなみに、コンパイラはインポート java.util.Iteratorしません-コンパイルされたバイトコードでは、各タイプはフルネームで参照されます。(とにかく、ローカル変数は実際には型指定されていません-一部のcheckcastアサーションでは他の変数です。)

于 2011-08-02T13:07:21.377 に答える