pp.07.01-synchronizedWrapper
SynchronizedCollection-Wrapper
- Projekt:
pp.07.01-synchronizedWrapper - Bearbeitungszeit: 20 Minuten
- Musterlösung: 10 Minuten
- Kompatibilität: mindestens Java SE 10
Quellcode von pp.SynchWrapper<T>1
Generell handelt es sich bei Wrappern um eine Anwendung des Decorator Design Patterns. Daher wird die Variable, die eine Referenz auf das gewrappte Objekt enthält, hier decorated genannt.
Die Factory-Methode synchronizedList soll eine Instanz der Wrapper-Klasse liefern, die den Zugriff zu decorated vermittelt.
Von dieser Factory-Methode aus wird der Konstruktor aufgerufen. Er ist private gekennzeichnet, damit er nicht “von außen” aufgerufen werden kann und Instanzen ausschließlich über die Factory-Methode syncheonizedList gebildet werden können.
Aufgaben
- Die vorgegebene Klasse
SynchWrapperist noch nicht vollständig. Implementieren Sie darin selber die Wrapper-Funtionalität, die Zugriffe für Listen synchronisiert. Die Funktion soll vergleichbar mitsynchronizedListsein, für die Umsetzung aber keine vorgefertigten Wrapper aus (z.B.synchronizedListausjava.util) verwenden:
- Schreiben Sie einen Unit-Test für die Methode
adddes Wrappers. Er soll zwei Threads verwenden, die nebenläufig derselben gewrappten Liste Elemente mitaddhinzufügen. Der Test ist erfüllt, wenn die Anzahl der Elemente der gewrappten Liste der zu erwartenden Anzahl entspricht.
Eine Anmerkung zu der möglicherweise ungewohnten Notation mit
<T>in der Methodensignatur vonsynchronizedList: Es handelt sich um eine Klassenmethode (static). Daher ist es nicht möglich, den Typ-ParameterTder KlasseSynchWrapper<T>zu verwenden, da er nur gebunden wird, wenn die Klasse instanziiert wird. Auf die KlassenmethodesynchronizedListwird aber über die Klasse zugegriffen – also unabhängig von etwaigen Instanzen (es könnte ja auch mehrere mit verschiedenen tatsächlichen Typ-Parametern geben). Da aber doch ein Typ-Parameter (T) verwendet wird, muss er als Teil der Methodensignatur bekannt gemacht werden. Dafür ist die Notation mit dem zusätzlichen<T>in der Signatur dieser Methode (vgl. z.B.public static <K, V> boolean comparein https://docs.oracle.com/javase/tutorial/java/generics/methods.html: “For static generic methods, the type parameter section must appear before the method’s return type.”)↩︎