如何在具有ArrayList的类中实现Iterable

时间:2013-08-15 01:08:15

标签: java android

我将有一个具有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();
}

3 个答案:

答案 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循环需要一个数组或IterableIterable需要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;
}