Lernstoff 2CHIF für PLF-2 am Di,2024-01-09

1. Schwerpunkte

Die in den letzten Beispielen verwendeten Konzepte, z.B.:

  • Maven-Projekt konfigurieren (erster Lauf HelloApplication z. Download, Source und Javadoc herunterladen)

  • Serialisierung (Import Serializable, Schreiben mit ObjectOutputStream, Lesen mit ObjectInputStream)

  • MVC

  • Layout (z.B. BorderLayout, GridPane, HBox, VBox, …​)

MenuBar, Menu, MenuItem

TextField, Button, Label, CheckBox, RadioButton, ToggleGroup, etc.

ComboBox, ListView (mit ObservableList)

Alert

Dialog (mit ResultConverter, Filter bei Fehler)

EventFilter

EventHandler

MouseEvent

WindowEvent

ChangeListener (an Properties)

Switch zw. Views

Properties (OPTIONAL, max. f. Bonus-Aufgaben)

2. Serialization

https://www.baeldung.com/java-serialization [Introduction to Java Serialization | Baeldung] …​ 2024-05-08

https://www.tutorialspoint.com/java/java_serialization.htm [Java - Serialization] …​ 2024-05-08

3. Events und Listeners

(z.B. EventHandler, ChangeListener, InvalidationListener, …​)

https://www.tutorialspoint.com/javafx/javafx_event_handling.htm [JavaFX - Event Handling] …​ 2024-05-08 https://taylorial.com/gui/fxevents/ [taylorial.com] …​ 2024-05-08

https://stackoverflow.com/questions/45117076/javafx-invalidationlistener-or-changelistener [java - JavaFX InvalidationListener or ChangeListener - Stack Overflow] …​ 2024-05-08

Dokument noch in Arbeit (Stand: 2023-12-30 15:40) !!
Es werden noch Links auf die entsprechenden Unterlagen-Seiten u.ä. eingefügt, u.U. Vergessenes ergänzt.

Im Prinzip ist der gesamte aktuelle Stoff Thema.

Hier eine provisorische Liste der wichtigsten Themen (hoffentlich nichts vergessen):

4. Schwerpunkte zur PLF-2:

Neben den unten angeführten Themen der letzten PLF liegt der Schwerpunkt diesmal in folgenden Themen:

  • Projekttyp Maven

    • Zuerst Erstellen eines "Empty Project" in IntelliJ: Menü File  New  Project…​, im Formular links oben 2. Eintrag: Empty Project.
      Feld Name liefert Verzeichnisname des Projekts (für PLF immer eigener Nachname – Anfangsbuchstabe GROSS, Rest klein), Feld Location ist das Basis-Verzeichnis (für PLF immer Z:\), in dem das Projekt-Verzeichnis <Name> angelegt wird.

    • Dann gerade erzeugtes IntelliJ-Projekt auswählen und danach mit Menü File  New  Module…​, im Formular links oben 1. Eintrag: New Module selektieren, Feld Name liefert Modul-Name (sollte aus Kleinbuchstaben, Ziffern und '-' ab 2. Stelle bestehen). Dieser ist per Default auch die Maven-ArtifactId), Feld Location sollte den Verzeichnispfad des zuvor ausgewählten IntelliJ-Projekts enthalten (). für PLF immer eigener nachname (ALLES kleinbuchstaben).

    • Import bestehender Source-Code in neu erstelltes Maven-Projekt:

      • Komplettes Basis-Package der Quelle (mit alles Sub-Packages und Java-Dateien) in das Ziel-Verzeichnis src/main/java kopieren

      • mit Refactor-Rename (wenn schwerere Java-Fehler bestehen, funktioniert nicht alles automatisch) das kopierte Package umbenennen

    • Setzen Java-Version und Encoding (maven.compiler.source, maven.compiler.target und project.build.sourceEncoding) in pom.xml

  • JUnit 5 via Maven, einfache Tests implementieren

    • Annotations @Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll

    • Test hinzufügen (Strg+Einfg), im Formular fehlendes JUnit5 fixen

    • AssertEquals

    • AssertTrue, AssertFalse

    • assertNull, assertNotNull

    • AssertThrows

  • List (mit generic Type)
    Deklaration: List<ElementType> list = new ArrayList<>(); (Typ möglichst allgemein – oft Interface)

  • Set hat keine definierte Ordnung → iterierbar nur mit "enhanced for" oder Iterator
    (Sicheres Entfernen mehrerer Elemente nur jeweils für aktuelles Element: theIterator.remove(); !!)
    Einzelnes Element kann gefahrlos mit theSet.remove(theElem); break; entfernt werden!

  • Map mit keySet(), values() (oder auch – nicht besprochen – entrySet()).
    Iteration mit

    • keySet() (z.B. for (KeyTyp k : map.keySet()) { …​ } ) oder

    • values() (z.B. for (ValueTyp v : map.values()) { …​ } ) oder

    • entrySet() (z.B. for (Map.Entry<KeyTyp, ValueTyp> entry : map.entrySet()) { …​ } )

    • oder Iterator (z.B. Iterator<KeyTyp> it = map.keySet().iterator(); while (it.hasNext()) { KeyTyp k = it.next(); …​ } )

  • Interface Comparable ("natürliche" Ordnung einer Klasse) mit this.compareTo(other)

  • Interface Comparator (zusätzliche Ordnung einer Klasse) mit comparator.compare(o1, o2)

  • sowohl this.compareTo(other) als auch compare(obj1, obj2) liefern int-Wert:

    • negativ: this bzw. obj1 ist kleiner als other bzw. obj2

    • 0: this bzw. obj1 ist gleich other bzw. obj2

    • positiv: this bzw. obj1 ist größer als other bzw. obj2

    Relation (kleiner, gleich, größer) immer bezogen auf den ersten Wert (this oder obj1 !!!). Zahlenwert ist IRRELEVANT !

  • Text-Dateien lesen und schreiben (mit FileReader, FileWriter, BufferedReader, BufferedWriter, PrintWriter).

    • Try with Resources (try mit Klammern, in denen die Reader/Writer-Objekte erzeugt werden, kein zwingendes catch! )

    • FileWriter-Objekt erzeugen mit Anfügen am Ende statt Neuschreiben: Konstruktor mit 2. Parameter boolean append auf true.

    • Zeilenweises Lesen mit aBufferedReader.readLine() mit:
      while ((line = br.readLine()) != null) { …​ }

    • Zeilenweises Schreiben mit
      aBufferedWriter.write(String s); aBufferedWriter.newLine() oder mit aPrintWriter.println(String s) (mit automatischem Zeilenvorschub)

5. Alte Lernstoff-Zusammenstellung für PLF-1 (RX):

  • Vererbung Grundlagen

    • Vererbung mit Schlüsselwort extends:
      public class Schueler extends Person {…​}

    • Methoden (und Attribute) die "weiter oben" in der Vererbungshierarchie implementiert und nicht private oder package-sichtbar (ohne Sichtbarkeits-Schlüsselwort private, protected oder private) sind, können von allen erbenden Klassen mitgenutzt, aber auch spezifisch überschrieben (override) werden.

    • Polymorphie: Die richtige Methodenversion wird dynamisch zur Laufzeit festgestellt und aufgerufen

    • Konstruktoren: Erstes Statement: Aufruf Superkonstruktor sein: super(param1, param2, …​) (Falls expliziter Aufruf fehlt und in Superklasse ein Default-Konstruktor existiert, wird dieser implizit aufgerufen)

    • V.a. bei Override: ZUgriff auf implementierte Methoden der Superklasse mit super.methodName()

    • Statische Methoden, Klassenvariabeln, Konstante und Konstruktoren liegen außerhalb der Vererbungslogik!!

  • Exceptions

    • Checked und Unchecked Exceptions

    • try-catch (nicht wirklich besprochen: -finally)

    • Werfen von Exceptions

    • Deklaration möglicherweise geworfener Exceptions (v.a. für Checked Exceptions)

    • Erstellen eigener Exceptions

    • Handling von Exceptions mit catch

  • Abstrakte Klassen (Instanzierungsverbot!)

    • Deklaration mit abstract

    • Abstrakte Methoden

    • Erben von abstrakten Klassen mit abstrakten Methoden

    • Implementieren von abstrakten Methoden

  • Interfaces Interface kann enthalten:

    • Deklarationen von Methoden (wie abstrakte Methoden)

    • Deklarationen von Konstanten (wie in Klassen)

    • Implementationen von static Methoden (wie in Klassen)

    • Implementationen von default Methoden (noch nicht unterrichtet)

  • Collections

    • Basics zu Generics

    • Generic Interfaces Collection, List, Set (List, Set "extends" Collection!)

    • Wichtige Operationen Collection: add, remove, contains, size, isEmpty, clear etc.

    • Wichtige zusätzliche Methoden von List und Set

    • Maps (Sammlungen von Schlüssel-Wert-Paaren)

    • Methoden boolean equals(Object other) und int hashCode()

  • (Sortieren von Listen noch nicht unterrichtet!)

6. Zusammenstellung von Koll. Lackinger:

  1. CharacterStreams/ByteStreams:

    1. Einlesen von Daten von einem File / parsen (+Exception Handling)

    2. Speichern von Daten in ein File (+Exception Handling) ➔ kein explizites Character encoding!

  2. Parsen von Files/Strings mit Hilfe von split – Unterscheidung von Zahl und Wort

  3. String Methoden

  4. Enums

  5. LocalDate, Period,: erzeugen, formatieren/ausgeben, vergleichen, addieren, subtrahieren, Alters und Zeitberechnungen ➔ keine Zeitzonen

  6. Verwendung des DateTimeFormatters

  7. Exception Handling, checked Exceptions und RuntimeExceptions, auch Vererbung

  8. Collections:

    1. List, HashMap

    2. Methoden mit Hilfe der API Doc anwenden

    3. erstellen einer Collection, einfügen, löschen, ändern, sortieren (nur ArrayList), auswerten und finden von Elementen (equals!!!)

  9. Vererbung

    1. abgeleitete Klassen und abstrakte Klassen implementieren

    2. eigene Interfaces erzeugen

    3. Verwenden des super Keyword im Konstruktor und in Methoden im Gegensatz zu this

    4. Verwenden aller Zugriffsmodifizierer (auch protected und/oder default)

    5. Verwendung der Interfaces Comparable und Comparator

    6. Überschreiben von Methoden (Polymorphie) und überladen von Methoden

    7. Überschreiben der equals Methode zur Verwendung der ArrayList Methoden remove(Object o) und contains(Object o).

    8. Überschreiben von toString()