2 package staticnested;
3
4 import java.util.NoSuchElementException;
5
6 /**
7 * IntList verwaltet ganze Zahlen als Liste.
8 * Beispielprogramm zur Programmiertechnik 1, Teil 4.
9 * @author H.Drachenfels
10 * @version 17.7.2024 Variante mit statisch eingebetteter Iterator-Klasse
11 */
12 public final class IntList {
13 private Element head;
14
15 /**
16 * Legt eine leere Liste an.
17 */
18 public IntList() {
19 this.head = null;
20 }
21
22 /**
23 * Fügt eine Zahl am Listenanfang ein.
24 * @param n die einzufügende Zahl
25 * @return die Liste
26 */
27 public IntList insert(int n) {
28 this.head = new Element(this.head, n);
29 return this;
30 }
31
32 /**
33 * Element speichert eine einzelne Zahl als Teil einer Liste.
34 * Beipiel für eine statisch eingebettete Klasse.
35 */
36 private static final class Element {
37 private final Element next;
38 private final int n;
39
40 private Element(Element e, int n) {
41 this.next = e;
42 this.n = n;
43 }
44 }
45
46 /**
47 * Iterator speichert den aktuellen Zustand einer Listeniteration.
48 * Beipiel für eine innere Klasse,
49 * hier mit einer statisch eingebetteten Klasse nachgebildet.
50 */
51 public static final class Iterator {
52 private final IntList list; // ersetzt IntList.this
53 private Element current;
54
55 /**
56 * Baut einen Iterator für eine Liste.
57 * @param list die Liste, über die iteriert werden soll
58 */
59 public Iterator(IntList list) {
60 this.list = list;
61 this.current = this.list.head;
62 }
63
64 /**
65 * prüt, ob das Listenende erreicht ist.
66 * @return false, wenn das Listenende erreicht ist, sonst true.
67 */
68 public boolean hasNext() {
69 return this.current != null;
70 }
71
72 /**
73 * liefert die aktuelle Zahl und iteriert zum nächsten Jahr.
74 * Aufruf am Listenende liefert NoSuchElementException.
75 * @return die aktuelle Zahl
76 */
77 public int next() {
78 if (this.current == null) {
79 throw new NoSuchElementException();
80 }
81
82 Element e = this.current;
83 this.current = this.current.next;
84 return e.n;
85 }
86 }
87 }
88