Hagen_1618_01 Flashcards
In welche Gruppen können die Ausnahmesituationen („Exceptions“), die in einem Programm im Allgemeinen auftreten können, eingeordnet werden?
- Ausnahmesituationen, die auf eine unvorsichtige Implementierungsarbeit hindeuten und die durch angemessene Überprüfungen vermieden werden können. Klassen, die diese Gruppe von Ausnahmen beschreiben, sind Subklassen von RuntimeException
- Ausnahmesituationen, die nicht vorhergesehen und nicht ausgeschlossen werden können, die aber zur Laufzeit mit hoher Wahrscheinlichkeit auftreten können und gegen die die Anwendung daher robust sein sollte; wie z.B. beim Netzwerk- / Datei-Zugriff oder Verwendung von Benutzereingaben. Klassen, die diese Gruppe von Ausnahmen beschreiben sind Subklassen von Exception oder Subtypen von Throwable, jedoch nicht von RuntimeException oder Error.
- Ausnahmesituationen, die nicht vorhergesehen werden können, auf die das Programm selber jedoch auch keine Einflussmöglichkeit hat. Situationen dieser Art stehen in keinem Zusammenhang mit einer konkreten Methode, sondern können an beliebigen Programmstellen unvermittelt auftreten. Klassen, die diese Gruppe von Ausnahmen beschreiben, sind Subtypen von Error.
Nennen Sie 2 Ihnen bekannte Ausnahmetypen aus der Java-Standardbibliothek, die aus verschiedenen der oben genannten Gruppen stammen, und ordnen Sie sie zu.
- NullPointerException (1) Durch defensives Programmieren kann diese Ausnahme vermieden werden.
- NumberFormatException (1) An den Stellen, an denen eine Zeichenkette in eine Zahl gewandelt werden soll, kann durch eine syntaktische Prüfung zuvor sichergestellt werden, dass die Konvertierung tatsächlich durchgeführt werden kann.
- FileNotFoundException (2) Da auch andere Programme Zugriff auf das Dateisystem haben, kann nicht ausgeschlossen werden, dass Dateien verändert oder gar gelöscht werden, nachdem sich das Programm ihrer Existenz vergewissert hat. Wann immer Dateien geladen werden sollen (deren Pfad z.B. aus einer Konfigurationsdatei gelesen wird), muss damit gerechnet werden, dass die Datei nicht mehr gefunden werden kann.
- IOException (2) (z.B. bei Netzwerkkommunikation) Findet ein Nachrichtenaustausch zwischen verschiedenen Rechnern statt, muss damit gerechnet werden, dass die Verbindung aufgrund eines Netzwerkproblems gestört wird.
- OutOfMemoryError (3) Während der Programmausführung wird weiterer Speicher benötigt, der aber nicht zur Verfügung gestellt werden kann. Der zur Verfügung stehende Speicher wird durch den Benutzer beim Start der Anwendung beschränkt und kann durch das Programm selber nicht geändert werden.
Welche vier Arten von Polymorphie kennen Sie?
- Subtyp-Polymorphie
- parametrische Polymorphie
- beschränkt parametrische Polymorphie (hierbei handelt es sich um eine spezielle Form der parametrischen Polymorphie)
- Ad-hoc Poly-morphie
Was ist Subtyp-Polymorphie?
Subtyp-Polymorphie wird durch Subtyping erreicht. Das bedeutet, dass an den Stellen, an denen ein Objekt vom Typ Typ erwartet wird, auch Objekte beliebiger Typen Subtyp stehen dürfen, sofern diese Subtypen von Typ sind.
Was ist Parametrische Polymorphie?
Parametrische Polymorphie wird dadurch realisiert, dass bestimmte Konstrukte einer Programmiersprache – z.B. Methoden oder Klassen – durch Typparameter parametrisiert werden. Bei der Verwendung eines so parametrisierten Konstrukts wird der Typparameter durch einen konkreten Typen ersetzt. So ist es möglich, eine generische Implementierung einer Funktionalität anzugeben, die in verschiedenen Kontexten typsicher genutzt werden kann.
Was ist beschränkt parametrische Polymorphie?
Die beschränkt parametrische Polymorphie begegnet dem Problem der (einfachen) parametrischen Polymorphie, dass innerhalb der generischen Klasse keine Informationen über den Typen, mit dem der Typparameter belegt wird, zur Verfügung stehen. Hierin können so ohne eine explizite Typkonvertierung (Type Casts) keine spezifischen Methoden verwendet werden.
Durch die Angabe einer Schranke zu dem Typparameter kann nun hingegen festgelegt werden, dass dieser lediglich durch Subtypen der Schranke belegt werden kann. So kann auch ohne Typkonvertierung (Type Cast) innerhalb der generischen Implementierung auf die durch die Schranke deklarierte Schnittstelle zugegriffen werden.
Was ist Ad-hoc Polymorphie?
Als Ad-hoc Polymorphie wird das Überladen von Operatoren bzw. Methodennamen bezeichnet. Für identifizierte Operationen können so für unterschiedliche Argumenttypen jeweils optimierte Implementierungen angegeben werden.
Welche Kommunikationsarten von Prozessen kennen Sie? Was zeichnet sie jeweils aus?
Eine synchrone Kommunikation zweier Prozesse kann nur dann stattfinden, wenn beide Prozesse zueinander passende Programmstellen erreicht haben. Gegebenenfalls muss der eine Prozess zunächst auf den anderen warten.
Bei asynchroner Kommunikation führen die Prozesse die Aktionen zur Kommunikation aus und arbeiten danach weiter, ohne auf eine Antwort zu warten.
Nennen Sie vier Kommunikationsmittel und ordnen Sie sie den Kommunikationsarten von oben zu.
Kommunikationsmittel zur asynchronen Kommunikation:
- Kommunikation über gemeinsamen Speicher
- Kommunikation über Nachrichten
Kommunikationsmittel zur synchronen Kommunikation:
- Entfernter Prozedur- bzw. Methodenaufruf
- Spezielle Kommunikationskonstrukte (z.B. Entries in der Sprache Ada)
In welchem Kontext werden anonyme Klassen in Java häufig verwendet? Warum eignen sie sich hier besonders gut?
Anonyme Klassen werden oft im Rahmen der Entwicklung von grafischen Benutzeroberflächen verwendet, z.B. um Beobachter-Objekte an Bedienelementen zu registrieren. Hierzu eignen sie sich besonders gut, da von einem Beobachter-Objekt, welches ein spezifisches Verhalten implementiert, in der Regel nur ein einziges Objekt benötigt wird.
Welche Gemeinsamkeiten und welche wesentlichen Unterschiede bestehen zwischen einer lokalen und einer anonymen Klasse?
Sowohl lokale als auch anonyme Klassen können nur in Anweisungsblöcken, also z.B. im Rumpf einer Methode, deklariert werden. Beide sind damit auch innere Klassen, die Komponenten einer umschließenden Klasse darstellen.
Gegenüber einer anonymen Klasse hat eine „einfache“ lokale Klasse einen Namen, sodass von ihr mehrere Instanzen erzeugt werden können. Aus gleichem Grund können auch Variablen mit ihr typisiert werden, was einen Aufruf neu deklarierter Methoden von außen erlaubt.
Wodurch zeichnen sich Programmgerüste aus? Nennen Sie die wesentlichen Merkmale und erläutern Sie sie anhand eines Ihnen bekannten Beispiels.
(Abs. 5.1) Ein Programmgerüst ist ein erweiterbares und anpassbares System von Klassen, das für einen allgemeinen, übergeordneten Aufgabenbereich eine Kernfunktionalität mit entsprechenden Bausteinen bereitstellt. Beispiel: Java AWT zur Gestaltung von Benutzeroberflächen (vgl. Abs. 5.2.2.5)
- „anpassbar“ Das AWT erlaubt die Anpassung der vordefinierten Komponenten, um z.B. die Darstellung auf dem Display des Benutzers oder das Verhalten der Komponenten anzupassen.
- „erweiterbar“ Das AWT erlaubt die Definition eigener Komponenten, die selbst bei der Implementierung verschiedener Benutzeroberflächen wiederverwendet werden können.
- „System von Klassen“ Die einzelnen Klassen des AWT sind eng miteinander gekoppelt. Um ihre eigene Aufgabe zu erledigen, müssen sie in der Regel viele Nachrichten mit Instanzen anderer Klassen austauschen, da sie von ihren Funktionalitäten abhängig sind.
- „allgemeiner, übergeordneter Aufgabenbereich“ Das AWT unterstützt die Implementierung von Benutzeroberflächen im Allgemeinen, ohne Details, z.B. zu ihrem Aufbau, festzulegen.
- „Kernfunktionalität“ Das AWT selbst bietet keine vordefinierte Benutzeroberfläche an, sondern lediglich die Bestandteile, um Elemente zu definieren, zu positionieren oder die Interaktion der Elemente festzulegen. Erst durch eine individuelle Konfiguration von Instanzen verschiedener Klassen entsteht eine darstellbare Benutzerschnittstelle.
Charakterisieren Sie jede der drei Komponente der MVC-Architektur
Model (Anwendungsschnittstelle): Die Schnittstelle zur Anwendung bietet Operationen an, die von dem Benutzer durch Interaktion mit der Programmoberfläche initiiert werden. Die Operationen lösen Reaktionen der Anwendungen (z.B. Berechnungen) aus und melden Zustandsänderungen an die Programmoberfläche.
View (Darstellung): Als „Darstellung“ bezeichnet man diejenigen Komponenten der Oberfläche, durch die der Benutzer die Anwendung steuert (in die er also Werte einträgt oder sie anklickt) oder informationen über ihren Zustand erhält.
Controller (Steuerung): Die Komponenten, die als „Controller“ bezeichnet werden, steuern die Interaktion zwischen den Komponenten der Programmoberfläche und der Anwendungsschnittstelle. Sie reagieren auf Ereignisse, die durch die Benutzerinteraktion mit der Oberfläche ausgelöst werden und rufen entsprechende Operationen der Anwendungsschnittstelle auf. Bei Bedarf aktualisieren sie die Programmoberfläche, um den aktuellen Status der Anwendung korrekt zu repräsentieren.
Aus welchen Elementen kann eine Interface-Deklaration bestehen?
- (teilweise optionale) Zugriffsmodifikatoren;
- Name des Interfaces;
- eine optionale Liste von Typparametern, ggf. mit Schranken;
- eine optionale Liste von Namen von Interfaces (als Supertypen), die dieses Interfaces erweitert;
- benannte Konstanten, d.h. final deklarierte statische Felder;
- erweiterte Methodensignaturen, die durch Klassen, die dieses Interface als Supertyp deklarieren, implementiert werden müssen.
Einer Ihrer Kollegen sagt Ihnen: „Interfaces in Java sind überflüssig. Statt ihnen könnte man in Java genauso abstrakte Klassen verwenden.“ Was sagen Sie dazu? Begründen Sie!
Zwar ist es möglich, abstrakte Klassen zur Deklaration der öffentlichen Schnittstelle von Objekten zu verwenden; allerdings erlaubt Java aufgrund der fehlenden Mehrfachvererbung nicht, zu einer Klasse mehrere (abstrakte) Superklassen zu spezifizieren. In der Konsequenz könnte jede Klasse nur einen direkten Supertyp haben. Dahingegen können zu einer Klasse mehrere Interfaces als Supertypen spezifiziert werden, sodass eine Klasse auch mehrere direkte Supertypen haben kann.