JAVA & Objektorientiertes Programmieren 2
Erweiterung der ersten Kartei
Erweiterung der ersten Kartei
Kartei Details
Karten | 203 |
---|---|
Sprache | Deutsch |
Kategorie | Informatik |
Stufe | Universität |
Erstellt / Aktualisiert | 19.01.2017 / 09.01.2024 |
Weblink |
https://card2brain.ch/box/20170119_java_objektorientiertes_programmieren_2
|
Einbinden |
<iframe src="https://card2brain.ch/box/20170119_java_objektorientiertes_programmieren_2/embed" width="780" height="150" scrolling="no" frameborder="0"></iframe>
|
Welche Implementationen der List<E> gibt es?
ArrayList, LinkedList, Stack*, Vector* etc
*Hinweis: Sehr alte Klassen, bessere Alternativen vorhanden
Was sind Eigenschaften einer Queue<E>?
Definiert eine Queue von Elementen vom Typ E
- Queue kann eine statische, beschränkte Grösse haben
- Elemente werden am Schwanz (tail) angehängt
- Elemente werden am Kopf (head) entnommen
Was ist der typische Verwendungszweck von einer Queue<E>?
Zwischenspeichern von Objekten vor der Verarbeitung
Beispiele: Warteschlange, Buffer, Unix-Pipe, Druckerqueue
Semantik meist nach FIFO-Prinzip
Welche Arten von Implementationen gibt es für die Queue<E>?
ArrayDeque, DelayQueue, LinkedBlockingQueue, PriorityQueue etc.
Wie ist die Deque<E> aufgebaut?
Spezialisiert die Semantik der Collection zu einer Queue welche in beide Richtungen verwendet werden kann
Das ermöglicht u.a. auch einen Stack: FILO-Semantik (first in, last out), was einen klassischen "Stapelspeicher" repräsentiert.
push() - Element auf Stack legen
pop() - Element von Stack abheben
(siehe Bild)
Was sind Eigenschaften einer Deque<E>?
Definiert eine Deque (double ended queue) von Elementen vom Typ E
- Eine Queue welche in beide Richtungen arbeiten kann
Semantik somit wahlweise nach FIFO- oder FILO-Prinzip (abhängig von konkreter Verwendung)
Was ist der typische Verwendungszweick einer Deque<E>?
Zwischenspeichern von Objekten vor/für die Verarbeitung, aber mit flexibler Semantik
Welche Arten von Implementationen gibt es für Deque<E>?
ArrayDeque, ConcurrenLinkedDeque, LinkedBlockingDeque, LinkedList etc
Was sind Eigenschaften einer Map<K,V>
Definiert eine Map mit Schlüssel vom Typ K (key) und für Werte vom Typ V (value)
Ein Schlüssel muss inerhalb einer Map eindeutig sein (Schlüssel werden intern als Set<K> abgelegt
Sowohl Wert als auch Schlüssel dürfen auch null sein (nur einmal pro Map). Ein Wert-Objekt kann mehrfach in einer Map abgespeicher werden (unter verschiedenen Schlüsseln)
Kann man Schlüssel-Objekte in einer Map<K,V> nach dem Einfügen verändern?
Ja, sollte man aber nicht!
Tipp: Für die Bearbeitung entnehmen und danach neu einfügen
Welche Arten von Implementationen gibt es für eine Map<K,V>?
EnumMap, HashMap, HashTable, Properties, TreeMap etc
Was bedeutet es wenn eine Implementation einer Collection nicht synchronisiert ist?
Sie ist nicht für parallele Zugriffe vorgesehen (-> dafür schneller)
Kann ein wichtiges Kriterium für die Auswahl einer bestimmten Implementation sein
Nicht alle Datenstrukturen erlauben einen direkten Zugriff per Index (z.B. verkettete Liste oder Baumstrukturen) Trotzdem möchten wir oft alle Elemente traversieren können!
Die Lösung: Iteratoren
Was machen Iteratoren?
Sie erlauben das Traversieren einer Collection ohne Bezug auf die konkrete Art der Datenstruktur zu nehmen!
Jedes in der Collection enthaltene Element wird während einer Iteration genau einmal zurückgegeben
Dank Polymorphie kommt jeweils der adäquat angepasste Algorithmus (-> Iterator) für jede Datenstruktur zum Einsatz
Es gibt für fixed-size-arrays und Datenstrukturen, welche Iteratoren unterstützen eine vereinfachte Syntax.
Wie sieht diese aus?
Bei Verwendung von Iteratoren ist darauf zu achten, dass man die zugrundeliegende Datenstruktur während dessen nicht verändert!
Was bedeutet dies konkret?
- kein Einfügen neuer Elemente
- keine Änderung enthaltener Elemente
- kein Entfernen enthaltener Elemente
Verwendet man einen Iterator um ein Element zu suchen, um dieses zu entfernen, gibt es eine spezielle Methode.
Welche?
remove()
Welche grundlegende Fehlerarten bzw. -kategorien gibt es?
1. Nicht behebbare Fehler. OutOfMemoryError
2. Durch reine Wiederholung (temporär Netzwerkunterbruch)
3. Durch aktive Korrektur (Unbekannter Hostname)
Was ist der Grundsatz der Fehlerbehandlung?
Fehler so nahe an der Quelle wie möglich, und so weit davon entfernt wie nötig behandeln!
Jeh näher, je mehr Informationen sind noch vorhanden.
Für jeden einzelnen Fehler sollte explizit was betrachtet werden?
- Wie ist er zu behandeln?
- Wo soll er behandelt werden? (auf welcher Ebene)
- Ist die Delegation an eine höhere Ebene sinnvoll (Softwareschichten)?
- Macht eine Nachfrage beim/der Benutzerin sinn?
- Muss die Verarbeitung / das Programm abgebrochen werden?
Wie signalisieren wir Fehler?
Wir verwenden den Rückgabewert einer Methode, um zu signalisieren, ob eine Aktion erfolgreich war oder nicht.
Beispiel: public boolean login(String uid, String pwd) {...}
Der Rückgabewert (boolean) sagt aus, ob das Login funktioniert hat oder nicht (für einfache Szenarien durchaus geeignet.
Der Quellcode wird sehr unübersichtlich.
- die Fehlerbehandlung dominiert den Quellcode
- der eigentliche Wesenskern wird geradezu verschleiert
- der Rückgabewert wird für den Fehlerstatus "verschwendet"
- oder noch schlimmer: Mit dem Resultat vermischt!
Bilanz: Nachteile überwiegen.
Bessere Lösung: Exceptions (Ausnahmebehandlung)
Wie funktionieren Exceptions?
Im Fehlerfall werden Exceptions erzeugt, mit Informationen bestückt und vonder Fehlerquelle "geworfen" (throw)
Exceptions können zur Behandlung "gefangen" (catch) werden, oder aber auch "weitergereicht" (throws) oder neu geworfen werden (rethrowing)
Was ist ein Vorteil des Exceptionhandlings?
Mit guten Exceptionhandling wird der Code übersichtlicher (Aber: Exceptions sind auch kein Allheilmittel!)
Nenne die Schlüsselwörter und deren Kurzbeschreib zum Exceptionhandling
- throw - löst eine Exception aus
- throws - reicht eine Exception an die nächst höhere Aufrufebene weiter
- try - Markiert einen Block in welchem Exceptions erwartet werden, die man "fangen" (behandeln) will
- catch - markiert einen Block für die Behandlung eines spezifischen Exceptiontyps (Klasse)
- finally - markiert einen optionalen Block der immer ausgeführt wird
Was sind die wichtigsten Methoden der Klasse Throwable und was ist diese Klasse?
Throwable ist die Basisklasse aller Exceptions
- getMessage() - Liefert Zusatzinformationen zu einer Exception als String (für Ausgabe)
- getCause() - Liefert ursprüngliche, auslösende Ausnahme (kann ganze Kette sein)
- printStackTrace(...) / getStackTrace(...) - Ermöglichen Zugriff auf Ein- und Ausgabe des Stacktrace
Die gelb markierten Konstruktoren sollten bei eigenen Exceptiontypen in der Regel überschrieben werden. (siehe Bild)