假设我有以下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 是一个接口,它不知道要返回哪个实现?