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