在考虑效率,代码可读性和其他标准时,更好的方式是公开集合的只读视图?从效率的角度来看它是否会产生任何真正的差异methodA而不是使用methodB?请考虑list可能经常访问的情况- 例如gui table的数据模型.
我假设Collectionss.umodifiebleList()总是创建一个新对象,这是正确的吗?
class A{
List<Object> list = new ArrayList<Object>();
List<Object> listReadOnly = Collections.unmodifiableList(list);
List<Object> methodA(){
return listReadOnly;
}
List<Object> methodB(){
return Collections.unmodifiableList(list);
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 10
是的,Collections.unmodifiableList每次都会创建一个新对象 - 但这是一个非常便宜的操作.(没有太多工作要做.)
我不确定GUI的数据模型是否可能一遍又一遍地获取集合 - 它显然会获取集合然后迭代它,但这是另一回事.
如果只是在每次有人提示GUI数据发生了变化时才取出一个集合,那么这种情况发生的时间相对较少,我预计 - 不会出现在"每秒数十万次"的范围内.瓶颈.我希望无论代码调用什么,这可能比创建不可修改列表所涉及的工作要多得多.
基本上,这感觉就像微优化太过分了,除非你有证据表明它引起了问题.一如既往,你应该:
不要这样做methodA,因为你必须在列表之间维护状态,这在多线程环境中可能很棘手,即使对于单线程环境也是如此.
做methodB,并让JDK整理效率(它非常快).
注意:除非列表中的元素本身是不可变的,否则methodB不是完全安全的,因为虽然列表可能是不可修改的,但其元素本身可能已被修改.考虑:
List<Date> list = new ArrayList<Date>();
list.add(new Date());
List<Date> dates = Collections.unmodifiableList(list);
Date date = dates.get(0);
date.setTime(0); // The date in the original list has now changed!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |