簡體   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