我将有一个具有ArrayList人员字段的类 我希望这个类的客户能够迭代这些对象。 我该怎么做呢?我是否只返回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();
}
答案 0 :(得分:2)
如果您想阻止通过迭代器修改列表本身,只需将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
,或者如果深层副本太昂贵或不必要,您可以创建一个{ {1}}扩展ImmutablePerson
并包装Person
但不允许通过setter进行修改,并返回包含实际Person
对象的列表。
答案 1 :(得分:1)
是。增强的for循环需要一个数组或Iterable
。 Iterable
需要iterator(
返回一个合理的迭代器,它对你的数据有用。
您现在可以使用增强型for循环,它在某种程度上在语义上是正确的。但是,Iterator
提供remove(
,因此使用您的迭代器的任何人都可以从您的人员列表中删除内容,这可能不是您想要的。在复制列表并获取 it 的迭代器时,使用new ArrayList(people).iterator()
或Collctions.unmodifiableList(people).iterator()
可能会有效。
您还可以通过创建一个创建getPeople
的getter或仅创建内部arrayList的副本来提供ImmutableList
。
另外请注意,如果您需要额外的功能,为什么不扩展ArrayList?我还没有看到你正在做什么,所以我只能猜测。
答案 2 :(得分:0)
只需为您的人员列表提供一个getter:
public ArrayList<Person> get getPeople() {
return people;
}