[英]How do I implement Iterable in a class that has an ArrayList
我将要创建一个具有ArrayList people字段的类,我希望此类的客户端能够迭代这些对象。 我该怎么做呢? 我是否只返回people.iterator(); ?
例如,在客户端中,我希望能够做到这一点:
for( Person p : people ) {
// do something
}
这是我班上需要的吗?
public class People implements Iterable<Person> {
private ArrayList<Person> people;
@Override
public Iterator<Person> iterator() {
// TODO Auto-generated method stub
return people.iterator();
}
如果要防止通过迭代器修改列表本身,只需将iterator()
委派给不可修改的列表,如下所示:
public class People implements Iterable<Person> {
private ArrayList<Person> people;
@Override
public Iterator<Person> iterator() {
return Collections.unmodifiableList(people).iterator();
}
}
否则,您所拥有的就好了。
但是请注意,除非Person
是不可变的,否则您无法采取任何措施阻止调用者修改Person
对象本身。 如果可以,那么没什么大不了的。 如果这是一个问题,那么你可以创建一个深层副本people
,并返回一个迭代了这一点。
如果您希望返回的迭代器反映对Person
的修改,但不允许更改Person
,或者如果深拷贝过于昂贵或不必要,则可以创建一个ImmutablePerson
来扩展Person
并包装一个Person
但不允许通过设置器进行修改,并返回包裹在实际Person
对象周围的列表。
是。 增强的for循环需要一个数组或Iterable
。 需要Iterable
拥有iterator(
返回一个合理的迭代器,该迭代器对您的数据具有有用的含义。
现在,您可以使用增强的for循环,它在语义上有些正确。 但是, Iterator
提供remove(
这样,使用迭代器的任何人都可以从您的人员列表中删除内容,这可能不是您想要的。也许可以使用new ArrayList(people).iterator()
或Collctions.unmodifiableList(people).iterator()
可以在复制列表并为其获取迭代器时可以工作 。
您还可以通过创建一个创建ImmutableList
或仅是内部arrayList副本的getter来提供getPeople
。
另外,如果需要额外的功能,为什么不扩展ArrayList? 我还没有完全了解您在做什么,所以我只能猜测。
只需为您的人员列表提供一个吸气剂即可:
public ArrayList<Person> get getPeople() {
return people;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.