章XIオブジェクトを保持している(下)
11.12コレクション和イテレータ
コレクションは、彼らが他のいくつかの共通インターフェースを表し、発生したいので、それはまだ、インターフェースインターフェースの子会社とすることができる、共通のルーツ・インターフェース内のすべてのシーケンスコンテナの説明です。また、java.util.AbstractCollectionののクラスが提供コレクション我々が作成できるように、デフォルトの実装をAbstractCollectionの不要なコードの重複がないそのサブタイプを、。
それはインタフェースではなく、特定の実装コードで書かれたため、より汎用的なコードを作成するために私達にできることです、我々のコードは、オブジェクトの多くの種類に適用することができた理由のインタフェース記述を使用してください。したがって、この方法ならば、私は書かれて受け入れるコレクションの方法は、任意の実装に適用することができ、その後、コレクションクラス。
あなたが達成したいときにはないコレクションあなたが実現するためにそれを維持するため、外部のクラスコレクションは非常に困難または面倒かもしれインターフェースを使用イテレータは非常に魅力的になります。例えば、我々が保持継承ペット作成するために、クラスオブジェクトを収集し、我々はすべて実装する必要があり、実現するのコレクション我々はあっても、メソッドを表示()メソッドはそれらを使用する必要がないので、ケースがなければなりません。これは、継承を通じてかもしれないがAbstractCollection 達成することは簡単ですが、あなたはまだ、とにかく施行する必要がイテレータとサイズ()を提供するためには、AbstractCollectionは実現しなかったが、AbstractCollection 他の方法は、に使用されます。
11.13 foreachのとイテレータ
これまでのところ、のforeach 構文は主に、アレイに使用されているが、それはまたいずれにも適用することができるコレクション我々は、実際に使用をたくさん見てきたオブジェクトのArrayList を使用する場合の例を、ここではより一般的な証明は次のとおりです。
輸入 java.utilの。* ; パブリック クラスForEachCollections { 公共 静的 ボイドメイン(文字列[]引数){ コレクションの<string> CS = 新しい LinkedListの<文字列> (); Collections.addAll(CS、 "自宅長い道のりを取る" .split(」 " )); 以下のため(のString:CS) System.out.print( " '" + S + "'" ); } }
出力は次のようになります。
'長い道のりを歩く'
ので csがあるコレクションので、このコードと示すことができるforeachのはすべてで動作するコレクションオブジェクトのプロパティ。
我々はので、仕事をすることができたのJava SE5は新しいが呼び出された紹介のIterable インタフェース、インタフェースが含まれている生成することができるイテレータのイテレータ()メソッドを、そして反復処理可能インターフェースがあるforeachのあなたがいずれかを作成するので、もし、順番に移動するために使用します実装反復処理可能クラスを、あなたはそれを使用することができますforeach 文で:
輸入 java.utilの。* ; パブリック クラス IterableClassは実装し反復処理可能<文字列> { 保護された String []型の言葉=(+「私たちは地球はバナナ型であることを知っている。」「そして、それはどのようにある」)スプリット(」 "。); 公共イテレータ<文字列> 反復子(){ 返す 新しいイテレータ<文字列> (){ プライベート int型のインデックス= 0 ; パブリック ブールのhasNext(){ リターン指数< words.length。 } 公共次の文字列(){ 返す言葉を[インデックス++ ]; } 公共 ボイド削除(){ スロー 新しい)(UnsupportedOperationExceptionが。 } }。 } パブリック 静的 ボイドメイン(文字列[]引数){ ため(文字列S:新しいIterableClass()) System.out.print(S + "" )。 } }
出力は次のようになります。
そしてそれは、我々は、バナナ状に地球を知っている方法です。
イテレータ()を実現メソッドが返すイテレータは、<文字列> のインスタンス匿名内部クラス、匿名内部クラスは、内のすべての単語を繰り返すことができます(メイン)見ることができIterableClassを使用する実際のforeach 文を。
11.13.1 アダプタクラスの従来の方法
あなたが今持っている場合は反復処理可能なクラスを、あなたは、の一つ以上追加したいのforeach 文のこのクラスの使用を行う方法をすべきですか?彼らはこのクラスを直接継承し、上書きされている場合たとえば、あなたが順方向または単語リストの逆方向反復に選択することができますしたいとイテレータ()メソッドを、あなたが選ぶ達成することができない、既存のメソッドを置き換えることができます。
一つの解決策は、いわゆるイディオムアダプタ方法、あなたが満たすために特定のインターフェイスを提供する必要があるため、デザインモードからアダプタ部でのforeach 文を。あなたがインターフェイスを持っており、別のインターフェイスを必要とする場合、書き込みアダプタは、問題を解決することができます。
import java.util.*; class ReversibleArrayList<T> extends ArrayList<T> { public ReversibleArrayList(Collection<T> c){ super(c); } public Iterable<T> reversed() { return new Iterable<T>() { public Iterator<T> iterator() { return new Iterator<T>() { int current = size() - 1; public boolean hasNext() { return current > -1; } public T next() { return get(current--); } public void remove() { throw new UnsupportedOperationException(); } }; } }; } } public class AdapterMethodIdiom { public static void main(String[] args) { ReversibleArrayList<String> ral = new ReversibleArrayList<>(Arrays.asList("To be or not to be".split(" "))); for (String s : ral) System.out.print(s + " "); System.out.println(); for (String s : ral.reversed()) System.out.print(s + " "); }
输出结果为:
To be or not to be
be to not or be To