克隆Set接口

时间:2016-07-20 03:02:26

标签: java set

我有一个类如下。

<table>
    <thead>
        <tr>
            <th>Course #</th>
            <th>Course name</th>
            <th>Credit hours</th>
            <th>Time</th>
            <th>Days</th>
            <th>Seats available</th>
        </tr>
    </thead>
    <tbody>
        {details}
    </tbody>
</table>

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

class ClassName{
    private Set<String> set;

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

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

如果我返回对集合本身的引用,那么获取Set的方法可以在Set中添加或删除,这与上面的类User不同。任何人都可以建议克隆该集的方法吗?

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

1 个答案:

答案 0 :(得分:-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;
    }
}