1 // IntList.java
2 package nested;
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 11 */
12 public final class IntList {
13 private Element head;
14
15 /** 16 * Legt eine leere Liste an. 17 * Der heimliche Parameter this verweist auf das neu allokierte Objekt. 18 */
19 public IntList() {
20 this.head = null;
21 }
22
23 /** 24 * Fügt eine Zahl am Listenanfang ein. 25 * Der heimliche Parameter this verweist auf das Objekt des Aufrufs. 26 * @param n die einzufügende Zahl 27 * @return die Liste 28 */
29 public IntList insert(/* final IntList this, */ int n) {
30 this.head = new Element(this.head, n);
31 return this;
32 }
33
34 /** 35 * Element speichert eine einzelne Zahl als Teil einer Liste. 36 * Beipiel für eine statisch eingebettete Klasse. 37 */
38 private static final class Element {
39 private final Element next;
40 private final int n;
41
42 private Element(/* final Element this, */ Element e, int n) {
43 this.next = e;
44 this.n = n;
45 }
46 }
47
48 /** 49 * Iterator speichert den aktuellen Zustand einer Listeniteration. 50 * Beipiel für eine innere Klasse. 51 */
52 public final class Iterator {
53 // private IntList IntList.this;
54 private Element current = IntList.this.head;
55
56 /** 57 * prüt, ob das Listenende erreicht ist. 58 * Der heimliche Parameter this verweist auf das Objekt des Aufrufs. 59 * @return false, wenn das Listenende erreicht ist, sonst true. 60 */
61 public boolean hasNext(/* final Iterator this */) {
62 return this.current != null;
63 }
64
65 /** 66 * liefert die aktuelle Zahl und iteriert zum nächsten Jahr. 67 * Aufruf am Listenende liefert NoSuchElementException. 68 * Der heimliche Parameter this verweist auf das Objekt des Aufrufs. 69 * @return die aktuelle Zahl 70 */
71 public int next(/* final Iterator this */) {
72 if (this.current == null) {
73 throw new NoSuchElementException();
74 }
75
76 Element e = this.current;
77 this.current = this.current.next;
78 return e.n;
79 }
80 }
81 }
82