假设我有以下Set
Set<String> fruits = new HashSet<String>();
fruits.add("Apple")
fruits.add("Grapes")
fruits.add("Orange")
如果我想创建一个防御性副本,这样如果原始列表被修改,副本不会反映它,我可以这样做:
Set<String> unmodifiableFruits = Collections.unmodifiableSet(new HashSet(fruits))
所以如果我这样做:
fruits.add("Pineapple")
println(unmodifiableFruits)
unmodifiableFruits
不会有菠萝。
或者我可以这样:
Set<String> unmodifiableFruits = Collections.unmodifiableCollection(fruits)
结果是一样的,unmodifiableFruits
不会有菠萝。
问题:
- 假设如果我
fruits
作为参数传递给一个类,首选方法是Collections.unmodifiableCollection()
?
原因是,我读过在构造函数中声明new
是一种不好的做法,如果我要使用Collections.unmodifiableSet()
,我需要声明一个new HashSet<String>(fruits)
.
为什么我不能这样做?
Collections.unmodifiableSet(fruits)
并让它返回一个不可修改的集合。
相反,我必须这样做:
Collections.unmodifiableSet(new HashSet<String>(fruits))
是不是因为 Set 是一个接口,它不知道要返回哪个实现?