Programming lesson
Generics und ArrayList in Java: Eine Schritt-für-Schritt-Anleitung für das CS211-Projekt 2 – Deus Ex Machina
Lerne, wie du Generics und ArrayList in Java für das CS211-Projekt 2 'Deus Ex Machina' einsetzt. Mit praxisnahen Beispielen aus der Welt der KI und Simulationen.
Einleitung: Warum Generics und ArrayList?
Im CS211-Projekt 2 'Deus Ex Machina' geht es darum, mit Generics und der ArrayList aus dem Java Collections Framework zu arbeiten. Dieses Tutorial hilft dir, die Konzepte zu verstehen, ohne die Hausaufgabe direkt zu lösen. Stell dir vor, du entwickelst eine KI wie in der Serie 'Westworld' – deine Maschinen (Roboter) müssen in verschiedenen Realitäten (Emulation, Simulacra, Simulation) kategorisiert werden. Genau das machst du mit Generics und ArrayList.
Was sind Generics?
Generics erlauben es dir, Klassen, Interfaces und Methoden zu definieren, die mit verschiedenen Datentypen arbeiten können, ohne die Typsicherheit zu verlieren. Statt für jeden Datentyp eine eigene Klasse zu schreiben, nutzt du einen Typparameter. Beispiel: List<String> speichert nur Strings – der Compiler prüft das.
Vorteile von Generics
- Typsicherheit: Fehler werden zur Compile-Zeit erkannt.
- Code-Wiederverwendung: Eine generische Klasse kann für viele Typen genutzt werden.
- Keine Casts: Du musst keine expliziten Typumwandlungen vornehmen.
ArrayList in Java
Die ArrayList ist eine dynamische Liste, die Elemente speichert und bei Bedarf wächst. Sie ist generisch, also ArrayList<Typ>. Typische Methoden sind add(), get(), remove(), clear(). Im Projekt nutzt du drei ArrayLists: emulation, simulacra, simulation – alle speichern SystemWhole-Objekte.
Das sublime-Paket: Aufbau und Typen
Dein Code liegt im Paket sublime. Du erstellst mehrere Klassen, die zusammenarbeiten. Wichtig: Das westworld-Paket darfst du nicht ändern. Du implementierst unter anderem:
- Realm-Enum:
EMULATION,SIMULACRA,SIMULATION - Abstrakte Klasse NarrativeLoop: Enthält drei
ArrayList<SystemWhole>und Methoden wiewipeNarrativeLoops()undupdateNarrativeLoops() - Weitere Typen (A bis J), die auf der Aufgabenbeschreibung basieren
Praktisches Beispiel: Kategorisierung von Emergenzen
Angenommen, du hast Emergenzen (Strings wie "{'kind': 'Square'}"). Deine Aufgabe: Sortiere sie in die drei ArrayLists. Hier kommt Generics ins Spiel: Du definierst eine Methode, die eine Liste von SystemWhole zurückgibt, aber die Logik ist generisch. Beispiel für eine Hilfsmethode:
public <T> List<T> filterByKind(List<T> items, String kind) {
List<T> result = new ArrayList<>();
for (T item : items) {
if (item.getKind().equals(kind)) {
result.add(item);
}
}
return result;
}Diese Methode arbeitet mit jedem Typ, der eine getKind()-Methode hat (z.B. über ein Interface).
Die NarrativeLoop-Klasse im Detail
Felder
protected final List<SystemWhole> emulation = new ArrayList<>();
protected final List<SystemWhole> simulacra = new ArrayList<>();
protected final List<SystemWhole> simulation = new ArrayList<>();Methoden
- wipeNarrativeLoops(): Ruft
clear()auf allen drei Listen auf. - updateNarrativeLoops(SystemWhole[] emulationContext, SystemWhole[] simulacraContext): Iteriert über die Arrays und fügt passende
SystemWholezu den Listen hinzu, basierend aufdetermineRealm(). - determineRealm(String kind, SystemWhole[] emulationContext, SystemWhole[] simulacraContext): Prüft, ob die
kindin den Kontexten vorkommt und gibt das passendeRealmzurück.
Trend-Beispiel: KI-Chatbots und Simulationen
Stell dir vor, du entwickelst einen KI-Chatbot wie ChatGPT. Die verschiedenen Versionen (GPT-3, GPT-4) sind wie Emulationen (hohe Genauigkeit), während abgewandelte Versionen für Spiele Simulacra sind. Einfache Regel-basierte Bots sind Simulationen. Genau diese Kategorisierung baust du mit deinem Code auf. Aktuelle Diskussionen über KI-Sicherheit und ethische Simulationen zeigen, wie relevant dieses Thema ist.
Häufige Fehler vermeiden
- Modifikation des westworld-Pakets: Nicht erlaubt! Nutze nur die öffentliche API.
- Verwendung veralteter Typen: Java 14+ vermeidet deprecated APIs.
- Fehlende Kommentare: Erkläre schwierige Schleifen oder generische Methoden.
- Sichtbarkeit von Feldern: Felder sind
protectedoderprivatemit Gettern.
Testen mit DoloresTest
Deine Tests schreibst du in DoloresTest.java. Beispiel für einen Test der wipeNarrativeLoops-Methode:
@Test
public void testWipeNarrativeLoops() {
NarrativeLoop loop = new NarrativeLoopImpl(); // deine Implementierung
loop.getEmulation().add(new SystemWhole(...));
loop.wipeNarrativeLoops();
assertTrue(loop.getEmulation().isEmpty());
}Fazit
Mit diesem Tutorial hast du die Grundlagen von Generics und ArrayList in Java verstanden. Du kannst jetzt die Struktur des CS211-Projekts 2 nachvollziehen, ohne die Lösung zu kopieren. Denk dran: Übung macht den Meister – experimentiere mit eigenen generischen Methoden und nutze die JavaDoc des westworld-Pakets. Viel Erfolg!