当前位置: 首页 > 面试题库 >

Guava ForwardingList用法示例

潘向明
2023-03-14
问题内容

我正在寻找解释Guava
ForwardingList类的示例代码。基本上,我正在实现一个自定义ArrayList类,该类将用于解决我之前的SO问题中提到的这一要求。我以前从未使用过Google收藏。但是,通过查看ForwardingList的JavaDoc,我认为可以通过对ForwardingList进行子类化来实现自定义类。


问题答案:

ForwardingList(后者extends ForwardingCollectionextends ForwardingObject实现了修饰符模式)。

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

  • @Override delegate() 返回方法转发到的支持委托实例
  • @Override``List您想要/需要装饰的任何方法

装饰器模式允许您使用合成而不是继承( Effective Java 2nd Edition,通过继承实现Favor合成
),并且ForwardingListGuava提供了一个方便的模板来编写您自己的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为了实现更完整的实现,还必须使用其他一些方法。



 类似资料:
  • Apache Commons CLI提供HelpFormatter类来打印命令行参数的使用指南。 查看示例。 例子 (Example) CLITester.java import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.Par

  • 本文向大家介绍PHP中list方法用法示例,包括了PHP中list方法用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP中list方法用法。分享给大家供大家参考,具体如下: 输出: 改变一下 输出: 再变一下 输出: 再变一下,举一反三学习法 输出: 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数组(Array)操作技巧大全》、《php排序算法总结》、《php字符

  • 本文向大家介绍document.forms用法示例介绍,包括了document.forms用法示例介绍的使用技巧和注意事项,需要的朋友参考一下 概述 forms 返回一个集合 (一个HTMLCollection对象),包含了了当前文档中的所有form元素. 语法 var collection = document.forms; 例子 获取表单信息

  • 请提供一个使用从容器a到容器B共享路径的示例,以及在共享完成后容器B如何访问该路径。 谢谢

  • 我正在通过一个例子,它从与方法引用相关的当前目录中提取一个隐藏文件数组,如下所述 使用匿名内部类实现 使用方法参考实现 我的问题是接口只有一个抽象方法(),而实现accept-method-using-method-reference在类中使用的有效性如何。我了解到,只有当参数与抽象方法匹配时,我们才能应用方法引用,但是这里method有一个类型的参数,但是没有参数。你能解释一下它的有效性吗。

  • 本文向大家介绍vue.js中$watch的用法示例,包括了vue.js中$watch的用法示例的使用技巧和注意事项,需要的朋友参考一下 前言 vue.js是一个数据驱动的web界面库。Vue.js只聚焦于视图层,可以很容易的和其他库整合。代码压缩后只有24kb Vue.js 提供了一个方法 watch,它用于观察Vue实例上的数据变动。对应一个对象,键是观察表达式,值是对应回调。值也可以是方法名,