我有一个类如下。
<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。
答案 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;
}
}