Java Guava ForwardingList使用示例

Java Guava ForwardingList使用示例,java,collections,guava,Java,Collections,Guava,我正在寻找解释Guava ForwardingList类的示例代码。基本上,我正在实现一个自定义ArrayList类,该类将用于解决中提到的这个需求。我以前从未使用过谷歌收藏。但只要看一下,我想我可以通过对ForwardingList进行子分类来实现我的自定义类 (这反过来又实现了 要使用,您只需做两件事: @Override delegate()返回方法转发到的后备委托实例 @Override任何您想要/需要修饰的列表方法 decorator模式允许您使用组合而不是继承(有效的Java第二

我正在寻找解释Guava ForwardingList类的示例代码。基本上,我正在实现一个自定义ArrayList类,该类将用于解决中提到的这个需求。我以前从未使用过谷歌收藏。但只要看一下,我想我可以通过对ForwardingList进行子分类来实现我的自定义类

(这反过来又实现了

要使用,您只需做两件事:

  • @Override delegate()
    返回方法转发到的后备委托实例
  • @Override
    任何您想要/需要修饰的
    列表
    方法
decorator模式允许您使用组合而不是继承(有效的Java第二版,支持组合而不是继承),Guava的
ForwardingList
提供了一个方便的模板,您可以从中编写自己的
List
实现,为您提供了所有管道机制

请注意,如果您计划装饰一个
ArrayList
,您可能希望您的
ForwardingList
子类也能实现


示例:
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); 
            }
        };
    }
}
import java.util.*;
导入com.google.common.collect.*;
公共类ListWithDefault扩展了ForwardingList{
最终E值;
最后名单代表;
ListWithDefault(列表委托,E默认值){
this.delegate=委托;
this.defaultValue=defaultValue;
}
@重写受保护的列表委托(){
返回代表;
}
@覆盖公共E-get(int索引){
EV=super.get(索引);
返回值(v==null?默认值:v);
}
@重写公共迭代器迭代器(){
最终迭代器iter=super.Iterator();
返回新的ForwardingIterator(){
@重写受保护的迭代器委托(){
返回iter;
}
@覆盖公共E next(){
EV=超级。下一步();
返回值(v==null?默认值: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]
}
publicstaticvoidmain(字符串[]args){
列表名称=默认的新列表(
Arrays.asList(“Alice”,null,“Bob”,“Carol”,null),
“未知”
);
for(字符串名称:名称){
System.out.println(名称);
}
//爱丽丝
//不为人知
//鲍勃
//卡罗尔
//不为人知
System.out.println(名称);
//[爱丽丝,空,鲍勃,卡罗尔,空]
}
请注意,这是一个不完整的实现。
toString()
方法仍然返回委托的
toString()
,它不知道默认值。为了更完整的实现,还必须使用一些其他方法
@Override

您应该实现ForwardingList方法来返回您在元素中使用的委托列表

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;
    }
}
public类YourList扩展了ForwardingList{
非公开最终名单代表;
公共列表(列表1、列表2){
委托=新的ArrayList(列表1);
delegate.addAll(列表2);
}
@凌驾
公开名单代表(){
返回代表;
}
}

Thank you@polygeneloolodes。有关更完整的示例,请参见
private class ContrainedList
此处: