昨天,当我在回答问题时使用迭代器和删除时收到ConcurrentModificationException错误我添加了一个通知,
当你有ArrayLists时,使用迭代器不是一个好主意.
你不需要深刻理解那个问题来回答这个问题.
在那里,我得到两条评论,我错了.
我的论点:
迭代器的代码可读性差得多.
有可能引发难以调试的ConcurrentModificationException.
你能解释一下吗?
问题:我们是否需要在ArrayList上使用迭代器?
UPD
这是关于显式使用Iterator.
Den*_*ret 22
使用ArrayLists的迭代器的一个大用例是当你想在迭代时删除元素.您只有三个安全的解决方案:
remove
方法假设你没有add
迭代,使用迭代器是一个避免的方法ConcurrentModificationException
.
可读性论证是主观的.就个人而言,我发现一个干净的声明迭代器不太可读.并且它并不重要,因为迭代器是同时迭代和删除的安全方式.
Dav*_*vid 11
似乎没有任何答案可以解释迭代器的原因.创建迭代器设计模式是因为对象应该控制它自己的状态(除了可能只有公共属性的值对象).
假设我们有一个包含数组的对象,并且该对象中有一个接口可以向该数组添加项.但你做了这样的事情:
class MyClass
{
private ArrayList<Item> myList;
public MyClass()
{
myList = new ArrayList();
}
public addItem( Item item )
{
item.doSomething(); // Lets say that this is very important before adding the item to the array.
myList.add( item );
}
}
Run Code Online (Sandbox Code Playgroud)
现在如果我在上面的课程中有这个方法:
public ArrayList getList()
{
return myList;
}
Run Code Online (Sandbox Code Playgroud)
有人可以通过这个方法获取对myList的引用,并将项添加到数组中,而无需调用item.doSomething(); 这就是为什么你不应该返回对数组的引用,而是返回它的迭代器.可以从数组中获取任何项目,但它无法操纵原始数组.所以MyClass对象仍然控制着它自己的状态.
这就是发明迭代器的真正原因.
归档时间: |
|
查看次数: |
6806 次 |
最近记录: |