繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM