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