【发布时间】:2019-10-06 23:51:55
【问题描述】:
在 vavr 中,您拥有不可变的 io.vavr.collection.Set。
考虑到可以从各种线程调用addName() 和names(),什么是正确的使用方式和惯用方式?
import io.vavr.collection.Set;
import io.vavr.collection.HashSet;
public class Names{
public/*private*/ /**volatile*/ Set<String> names = HashSet.empty();
public void addName(String name){
names = names.add(name);
}
public Set<String> names(){
return names;
}
}
我应该使用 volatile 吗?我应该改用AtomicRef<Set<String>> 吗?
【问题讨论】:
-
用另一个替换不可变变量意味着您仍然具有可变状态。如果您有可变状态,则它不是一种功能方法。如果您不使用函数式方法,也许使用
ConcurrentHashMap.newKeySet()会更好? -
我喜欢函数式集合的地方在于,迭代器可以正常工作,而且您无需在传递之前克隆集合。