【问题标题】:Cloning of Set interface [duplicate]Set接口的克隆[重复]
【发布时间】:2016-07-20 03:02:25
【问题描述】:

我有一个如下所示的类。

class ClassName{
    private Set<String> set;

    public ClassName(Set<String> set){
        this.set=set;
    }

    public Set<String> getSet(){
        return set;
    }
}

我想通过 getter 返回集合的克隆,而不是对集合本身的引用。因为 set 是一个接口,所以它没有 clone 方法。

class User{
    public static void main(String[] args){
        HashSet<String> hs=new HashSet<String>();
        hs.add("str1");
        hs.add("str2");
        ClassName cn=new ClassName(hs);
        HashSet<String> newHS=cn.getSet();
        newHS.add("str3");
    }
}

如果我返回对集合本身的引用,那么获取集合的方法可能会从集合中添加或删除,这不像上面的用户类那样有利。任何人都可以建议一种克隆集合的方法吗?

使用 Set 而不是 HashSet 或 TreeSet 的原因是因为这将使 ClassName 可重用,因为当我决定将来使用不同类型的 Set 时,我不必更改 ClassName。

【问题讨论】:

  • .clone() 在 Java 中是坏的,一直都是,你永远都不想使用.clone()。看来您真的只是想要一个支持集的ImmutableSet 视图。

标签: java set


【解决方案1】:

如果你不想引入额外的库,那么你应该在构造函数中复制集合,并在 getter 中返回 unmodifiableSet

class ClassName{
    private Set<String> set;

    public ClassName(Set<String> set){
        this.set= new HashSet<>(set);
    }

    public Set<String> getSet(){
        return Collections.unmodifiableSet(set);
    }
}

如果您的类路径中有 Guava 库,或者不介意在项目中添加依赖项,那么使用 ImmutableSet 作为成员变量是一个更好的选择。

class ClassName{
    private ImmutableSet<String> set;

    public ClassName(Set<String> set){
        this.set= ImmutableSet.copyOf(set);
    }

    public ImmutableSet<String> getSet(){
        return set;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 2011-10-07
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2020-03-04
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多