9

Guava ForwardingList クラスを説明するサンプル コードを探しています。基本的に、以前の SO questionで述べたこの要件を解決するために使用されるカスタム ArrayList クラスを実装しています。以前に Google コレクションを使用したことはありません。しかし、ForwardingList のJavaDoc を見るだけで、ForwardingListをサブクラス化することでカスタム クラスを実装できると思います。

4

2 に答える 2

20

ForwardingList(これextends ForwardingCollectionは、次に)デコレータ パターンextends ForwardingObjectを実装します。

使用するには、次の 2 つのことを行うだけです。

  • @Override delegate()メソッドの転送先のバッキング デリゲート インスタンスを返す
  • @OverrideListあなたが望む/飾る必要があるどんな方法でも

デコレーター パターンを使用すると、継承の代わりに構成を使用できます ( Effective Java 2nd Edition、継承よりも構成を優先する) ForwardingList。Guava からは、独自の実装を作成するための便利なテンプレートがList提供され、すべての配管メカニズムが提供されます。

ArrayListをデコレートする予定がある場合は、ForwardingListサブクラスにも を実装する必要があることに注意してくださいRandomAccess


例:ListWithDefault

デリゲートの値を指定されたデフォルト値にForwardingList置き換える(不完全な) 例を次に示します。null

import java.util.*;
import com.google.common.collect.*;

public class ListWithDefault<E> extends ForwardingList<E> {
    final E defaultValue;
    final List<E> delegate;

    ListWithDefault(List<E> delegate, E defaultValue) {
        this.delegate = delegate;
        this.defaultValue = defaultValue;
    }
    @Override protected List delegate() {
        return delegate;
    }
    @Override public E get(int index) {
        E v = super.get(index);
        return (v == null ? defaultValue : v);
    }
    @Override public Iterator<E> iterator() {
        final Iterator<E> iter = super.iterator();
        return new ForwardingIterator<E>() {
            @Override protected Iterator<E> delegate() {
                return iter;
            }
            @Override public E next() {
                E v = super.next();
                return (v == null ? defaultValue : v); 
            }
        };
    }
}

次に、次のようにテストできます。

    public static void main(String[] args) {
        List<String> names = new ListWithDefault<String>(
            Arrays.asList("Alice", null, "Bob", "Carol", null),
            "UNKNOWN"
        );

        for (String name : names) {
            System.out.println(name);
        }
        // Alice
        // UNKNOWN
        // Bob
        // Carol
        // UNKNOWN

        System.out.println(names);
        // [Alice, null, Bob, Carol, null]
}

これは不完全な実装であることに注意してください。toString()メソッドは引き続きデリゲートの を返しますが、toString()これはデフォルト値を認識していません。@Overrideより完全な実装のためには、他のいくつかのメソッドも必要です。

于 2010-08-17T11:58:57.060 に答える
4

要素で使用しているデリゲート リストを返すには、ForwardingList のdelegate()メソッドを実装する必要があります。

public class YourList<E> extends ForwardingList<E> {
    private final List<E> delegate;

    public YourList(List<E> list1, List<E> list2) {
        delegate = new ArrayList<E>(list1);
        delegate.addAll(list2);
    }

    @Override
    public List<E> delegate() {
        return delegate;
    }
}
于 2010-08-17T12:02:21.967 に答える