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

Java 如何在具有ArrayList的类中实现Iterable,java,android,Java,Android,我将有一个类,它有一个ArrayList人员字段 我希望此类的客户端能够迭代这些对象。 我该怎么做?我是否只返回people.iterator() 例如,在客户机中,我希望能够做到这一点: for( Person p : people ) { // do something } 这就是我在班上需要的吗 public class People implements Iterable<Person> { private ArrayList<Person> peo

我将有一个类,它有一个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();
}
公共类人员实现Iterable{
私人ArrayList人;
@凌驾
公共迭代器迭代器(){
//TODO自动生成的方法存根
返回people.iterator();
}

是。增强型for循环需要一个数组或
Iterable
Iterable
需要有
迭代器(
),该迭代器返回一个合理的迭代器,该迭代器对您的数据具有有用的意义

您现在可以使用增强的for循环,它在语义上是正确的。但是,
Iterator
提供了
remove(
),因此任何使用您的迭代器的人都可以从您的人员列表中删除可能不是您想要的内容。可能使用
新的ArrayList(people).Iterator()
collections.unmodifiableList(people).iterator()
可以在复制列表并获取其迭代器时工作

您还可以通过创建一个getter来提供
getPeople
,该getter创建一个
ImmutableList
,或者只创建一个内部arrayList的副本


另一方面,如果您需要额外的功能,为什么不扩展ArrayList?我还没有看到您在使用它做什么,所以我只能猜测。

只需为您的人员列表提供一个getter:

public ArrayList<Person> get getPeople() {
   return people;
}
public ArrayList get getPeople(){
还人,;
}

如果要防止通过迭代器修改列表本身,只需将
迭代器()委托给如下不可修改的列表:

public class People implements Iterable<Person> {

    private ArrayList<Person> people;

    @Override
    public Iterator<Person> iterator() {
        return Collections.unmodifiableList(people).iterator();
    }

}
公共类人员实现Iterable{
私人ArrayList人;
@凌驾
公共迭代器迭代器(){
返回Collections.unmodifiableList(people.iterator();
}
}
否则,你所拥有的一切都很好

但是,请注意,除非
Person
是不可变的,否则您无法阻止调用方修改
Person
对象本身。如果可以,那么没什么大不了的。如果这是一个问题,那么您可以创建
Person
的深度副本,并返回迭代器


如果希望返回的迭代器反映对
Person
s的修改,但不允许更改
Person
s,或者如果深度副本过于昂贵或不必要,则可以创建一个
ImmutablePerson
,该迭代器扩展
Person
并包装
Person
,但不允许通过set进行修改返回对内部列表的引用可能不是一个好主意,也许可以使用一个副本来代替?@hexafrance为什么返回对列表的引用不是一个好主意?它不是一个静态列表。我们不确定,但OP编写的类可以使用它在我们看不到的内部位置,代码看起来很简略。至少我会返回
集合。不可修改的列表(人);
,并且只有当
人是不可变的(并且可能更进一步,仅当
最终的
,这取决于需求).我想我有很多东西要学。我想答案不是在类外迭代?我应该为类提供一个方法,在类内完成我想要的事情,对吗?“这就是我在类中需要的吗?”…呃,我们不知道,是吗?那肯定会从私有的
ArrayList
返回一个
迭代器
。谁能否决我的问题,请告诉我为什么?我当然不想问愚蠢的问题。我想从下面的答案中,我现在对我的问题中上述代码的含义有了更多的了解扩展ArrayList是我最初的计划,但我当时认为封装可能会更好。另一个原因是,我需要将其打包,而我不知道如何使ArrayList的扩展可以打包(Person已经是了,我想我可以找出如何使用ArrayList字段创建类Parcelable@nPn好的。请记住,由于迭代器的
remove(
方法),这可能会导致数据保护方面的失控。@您可以返回
集合。不可修改列表(人员)。迭代器()
(见下面我的答案)。谢谢Jason,你再次帮助了我。看看我的客户机代码中循环通过人物的地方,这正是我想要在类中首先推出的功能。