...
Hvis en tenker over det, så er det nettopp iterator()-metoden, som er nøkkelen til at for-each-løkka virker. Det holder at stringListe i kode-eksemplet har en slik metode, for at den skal kunne "omskrives" til koden til høyre som den tilsvarer. Denne koblingen mellom for-each-løkka og iterator()-metoden er ikke tilfeldig, og for å gjøre koblingen eksplisitt og mulig å utnytte for klasser utenfor Collection-rammeverket, så er iterator()-metoden definert i et eget grensesnitt ved navn Iterable (i java.lang-pakken, så en slipper egen import-setning). Det er altså fordi en ArrayList implementerer Iterable at en for-each-løkke med en ArrayList virker! Og ArrayList implementerer Iterable fordi den implementerer List, og List utvider Collection som utvider Iterable. Denne koblingen mellom ArrayList og Iterable er illustrert under med et klassediagram:
...
Klasse som bruker ArrayList | Klasse som også implementerer Iterable | for-each-løkke |
---|
Code Block |
---|
| public class Library {
private Collection<Book> books = new ArrayList<Book>();
public void addBook(Book book) {
books.add(book);
}
public void removeBook(Book book) {
books.remove(book);
}
} |
| Code Block |
---|
| public class Library implements Iterable<Book> {
... books-feltet og add- og remove-metodene her ...
// fra Iterable<Book>
public Iterator<Book> iterator() {
return books.iterator();
}
} |
PlantUML Macro |
---|
interface "Iterable<T>" as iterable {
Iterator<T> iterator()
}
class Library
iterable <|-right- Library
|
| Code Block |
---|
// lag en Library-instans
Library library = new Library();
// legg til noen bøker
library.addBook(new Book(...));
library.addBook(new Book(...));
// gå gjennom bøkene
for (Book book : library) {
// gjør noe med book her
...
} |
|
...