1Werden finale Felder in Java-Clone richtig kopiert? (Shallow Copy)
Ja
2Werden finale Felder in Copy Ctor richtig kopiert?
Ja, sie können richtig initialisiert werden
3Werden finale Felder bei Java Reflection richtig kopiert?
Nein, sie dürfen nicht vorkommen
4Es wird eine Deep Copy erstellt a) bei Java clone und/oder b) mit Copy Ctor
Beides möglich, muss selber gemacht werden
5Wie wird bei a) Java-clone und b) Copy Ctor mit zyklischen Strukturen / Alias-Referenzen umgegangen?
Müssen selbst korrekt aufgelöst werden
6Werden Strings in einer Shallow Copy richtig kopiert?
Nein, bei java clone per default nicht
7Werden finale Felder bei Java Serialization richtig kopiert?
Ja
8Reflection kopiert automatisch deep
richtig, man hat keine Kontrolle
9Serialization kopiert automatisch deep
Richtig, eingeschränkte Kontrolle
10zyklische Strukturen werden sowohl bei Reflection als auch bei Serialization automatisch aufgelöst
richtig
11ordne Java-Clone, Reflection, Copy Ctor und Serialization nach Effizient
1) Java Clone und Copy Ctor 2) Reflection 3) Serialization
12Strings werden bei Reflection kopiert
falsch, sie sind als immutable registriert
13Strings werden bei Serialization kopiert
richtig
14Welche Methode braucht als einzige einen nicht parametrisierten Konstruktor
Reflection, um Instanzen zu erzeugen
15Alle Kopiermethoden ausser Serialisierung kompilieren mit Java.lang.Cloneable
nein, alle ausser Copy Ctor
16Was sollte für Information Hiding kopiert werden?
Alle veränderbaren Objekte beim Herausgeben oder Reinkommen
17Welche Sachen sind in Sachen Information Hiding sicher?
primitive Datentypen und immutable Objects (Strings, Color...)
18Was ist eine unveränderliche Klasse?
Klasse, deren Instanzen nicht verändert werden können
19Nachteil unveränderlicher Objekte
Jeder Wert braucht neue Instanz, kann Performance verschlechtern
20Welche Schritte um Klasse immutable zu machen
- alle Felder private und final
- keine Setter Methoden
- Klasse ist final
- Zugriff auf alle veränderlichen Komponenten muss exklusiv sein
21Was sind die Vorteile unveränderlicher Klassen?
- gute Bausteine und Keys für Maps
- sicher, einfach zu benutzen
- einfach zu implementieren
- können nur einen Zustand haben
- threadsicher
- auch Interna können gemeinsam benutzt werden
- weniger fehleranfällig
- vorübergehende Inkonsistenz ist ausgeschlossen
22Alternative zu final Klassen
private Konstruktoren & öffentliche statische Factory Methode
23Decorator Objekte haben den gleichen Supertyp wie die dekorierten Objekte
Richtig
24Das .... Muster erweitert ein Objekt dynamisch um weitere Verantwortlichkeiten. Es bietet eine flexible Alternative zu Subklassen für die Erweiterung der Funktionalität
Decorator
25Vorteile Decorator Pattern
zusätzliche Funktionalität kann zur Laufzeit hinzugefügt werden
26Decorator Klassendiagramm
27 Beispiel Decorators ineinander verpacken
Beverage b = new Whip(new Mocca(new Houseblend(Beverage.SIZE_VENTI)))
28Decorator Sequenzdiagramm
29Welche Bedingung muss erfüllt sein, wenn eine Decorator zusätzliche Methoden enthält?
Er muss am Angang der Kette stehen.
30Decorator vs State/Strategy
Decorator fügt zusätzliche Funktionalität dazu und verändert die Identität des Objekts, State/Strategy verändern das Verhalten des Objekts komplett
31Das ... Muster verkapselt einen Auftrag von einem Objekt und ermöglicht es dadurch, andere Objekte mit verschiedenen Aufträgen zu parametrisieren, Aufträge in Warteschlangen einzureihen oder zu protokollieren oder das Rückgängigmachen von Operationen zu unterstützen.
Command
32Klassendiagramm Command
33allgemeine Form der Factory Method
public Product createProduct(String type)
34Unterschied Factory Method und Abstract Factory
Factory Method = Vererbung, gibt einzelnes Produkt zurück
Abstract Factory = Komposition, gibt Produktfamilien zurück
35Welche Probleme kann Vererbung verursachen?
- Supertyp verändert Funktionsweise seiner Methoden = Supercalls in überschriebenen Methoden in Subklasse funktioniert nicht mehr wie gewünscht
- Sicherheitslücken (nur neue Methoden ist viel sicherer)
- neue Methoden könnten zufälligerweise die gleiche Signatur haben wie zukünftige neue Methoden in der Parent-Klasse und dann nicht mehr funktionieren
36Wie löst man Probleme mit Vererbung
Komposition
37Wie funktioniert Komposition?
Klasse enthält ein Objekt des Types der Superklasse und leitet Methoden an dieses Objekt weiter
38Wann ist Vererbung sinnvoll?
Wenn die Klasse B ein tatsächlich logischer Subtyp der Klasse A ist (Katze B ist ein Tier A)
39Klassendiagramm abstract Factory
40Das ... Muster bietet eine Schnittstelle zum Erstellen von Familien verwandter oder zusammenhängender Objekte an, ohne konkrete Klassen anzugeben.
Abstract Factory
41Wie kann man eine Factory zur Verfügung stellen?
CurrentFactory Klasse, ConcreteFacotory hat dann:
static { CurrentFactory.setFactory(new ConcreteFactory()); }

42Was ist ein statischer Initialisierungs-Block?
static {...}
wird aufgerufen, sobald eine Klasse im Runtime Environment ist
43Wie wird die CurrentFacitory gesetzt?
in der main Methode:
Class.forName(args[0]); ruft static{....} der Klasse an Stelle 0 im args Array auf und setzt so die currentFactory.
args[] wird über die Spring Beans Konfiguration gesetzt
44Was ist Schnittstellenvererbung?
InterfaceB extends InterfaceA
ist okay, InterfaceA kann weiterhin so verwendet werden wie immer. Wird gebraucht, wenn zB neue Klassen InterfaceA benutzen sollen, aber noch weitere Methoden brauchen, die dann in InterfaceB definiert sind. Man sollte nie ein InterfaceA einfach erweitern, das würde alle anderen Klassen, die InterfaceA implementieren zerstören
45Was ist Implementierungsvererbung?
die normale Vererbung, wenn eine Klasse B von Klasse A erbt
46Was ist Dependency Injection?
Form von inversion of Control, Instanzen werden nicht selbst neu erstellt sondern ein Assembler erstellt sie und weiss, an welchen Stellen die INstanzen einzufügen sind. Kann mit Spring gemacht werden
47Wofür ist Dependency Injection gut?
Um eine enge Kopplung zu vermeiden
48Was sind Beans?
Objekte, die von Spring erzeugt werden. Es sind Singletons.
49<beans> definiert alle beans, <bean> definiert ein bean, <property> setzte SwingFactory im CalculatorBuilder -> entspricht Setter Methode
50Welche Ausgabe ist korrekt?

A
51Welche Ausgabe ist korrekt?

Laufzeitfehler
52Was ist die Ausgabe?

B
53Was ist die Ausgabe

kompiliert nicht, clone() muss in allen Klassen oberhalb implementiert sein
54Was macht der Code?

Führt zu einem Stack Overflow
55Was macht der Code?

Führt zu einer Deep-Copy
56Was wird hier ausgegeben?

false
57Was wird ausgegeben?

1/2
58Kompiliert dieser Code?

Nein, die Klasse A verhält sich als wäre sie final und kann nicht erweitert werden wegen dem privaten Konstruktor
59Was ist hier falsch? (Hint: Decorator Ketten)

Es wird auf den Owner der Handles geprüft, f ist aber nicht immer die konkrete Figur sondern evtl ein Decorator
60Wie kann man das Problem mit den stehenbleibenden Handles beim Löschen einer Figur lösen? Was ist da überhaupt das Problem?
Die gelöschte Figur ist nicht unbedingt eine konkrete Figur sondern evtl ein Decorator. Lösungen: 1) Handles-Decorator implementieren 2) Gleichheit über die ganze Kette prüfen
61Was ist das für eine Methode und wo muss sie deklariert werden?

instanceof für Decorator Ketten, wird in der Component Abstraktion deklariert
62Ordne die Command Rollen diesem Code zu

JButton = Invoker
actionPerformed() = execute
AngelListener = Command
ActionListener = CommandInterface
TheClass = Client
System = receiver
63in der undo Methode eines Macro Command muss das undo der Command Objekte in welcher Reihenfolge aufgerufen werden?
in umgekehrter Reihenfolge (reverse List Order)
64Welches Design-Pattern verwendet der Marco-Command?
Composite
65Im Abstract Factory Pattern ist es aufwändig/schnell umgesetzt eine neues konkretes Produkt hinzuzufügen.
aufwändig (Das Produkt muss in jeder Familie hinzugefügt werden)
66Im Abstract Factory Pattern ist es aufwändig/schnell umgesetzt eine neue Produktfamilie hinzuzufügen.
schnell umgesetzt
67Um welches Muster handelt es sich hier?

Abstract Factory
68Welches Muster ist das?

Factory Method
69In welcher Reihenfolge werden die Methoden aufgerufen?

B.n, B.m, A.m, B.n, B.m.... Stackoverflow
70Was wird ausgegeben?

Kompilierfehler
71Was wird ausgegeben?

0, j wird ausgegeben, bevor es instanziiert wird
-> i ist nicht definiert auf B, also geht es hoch zu A. Dort wird i gesetzt und im Konstruktor init() aufgerufen. init() ist bei B definiert, also wird das dort aufgerufen und returned j, das zu dem Zeitpunkt noch 0 ist.