【问题标题】:Using Guava's Forwarding Decorators to create specific collections使用 Guava 的转发装饰器创建特定的集合
【发布时间】:2013-02-28 16:08:34
【问题描述】:

我有多个使用多个 Collection 参数的方法。

我想让事情更具体,所以我想使用转发装饰器

首先想到的问题是:

  • 使用 Forwarding Decoartor 是不是有点过头了,我是不是缺少了一个 更简单的东西,我的意思是这非常简单,感谢 Guava 但还是?

如果转发装饰器是正确的路径,那么

到目前为止看起来还不错,但我不确定的一件事是如何取回基本集合(在这种情况下为 ImmutableSet)?

  1. 我是否只是创建一个返回的新方法(在接口和类中) “代表” ? (如果是这样,什么是好的方法名称?)
  2. 还是有更多?

在以下代码中,我将 ImmutableSet 保存为 setA。

代码:

界面:

package com.ps.experiment.forwarding;

import java.util.Collection;

public interface ISetA extends Set<String>{}

类:

package com.ps.experiment.forwarding;

import com.google.common.collect.ForwardingSet;
import com.google.common.collect.ImmutableSet;

    public class SetA extends ForwardingSet<String> implements ISetA
    {
        final ImmutableSet<String>  delegate;   // backing list

        @Override
        protected ImmutableSet<String> delegate()
        {
            return this.delegate;
        }

        private SetA(final ImmutableSet<String> strings)
        {
            this.delegate = strings;
        }

        public static ISetA of(final ImmutableSet<String> strings)
        {
            return new SetA(strings);
        }
    }

【问题讨论】:

    标签: java collections guava


    【解决方案1】:

    您编写的代码是正确的方法。如果要访问后端集合,只需将delegate() public 改为protected

    【讨论】:

    • 我有一个后续问题。假设我需要 7 个这样的特定接口和类,让我们假设所有 ImmutableSet,除了复制代码并更改类和接口名称之外还有什么更好的选择。这样做的原因是所有 7 个东西都使用相同的集合类型,但我想确保不接受错误的参数,因此不接受 7 个不同的接口和类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多