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
package pp;
import java.util.List;
public class SynchWrapper<T> {
private final List<T> decorated;
public static <T> List<T> synchronizedList(List<T> list) {
return (List<T>) new SynchWrapper<>(list);
}
private SynchWrapper(List<T> list) {
this.decorated = list;
}
}
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
SynchWrapper
ist noch nicht vollstaändig. Implementieren Sie darin selber die Wrapper-Funtionalität, die Zugriffe für Listen synchronisiert. Die Funktion soll vergleichbar mitsynchronizedList
sein, für die Umsetzung aber keine vorgefertigten Wrapper aus (z.B.synchronizedList
ausjava.util
) verwenden:
- Schreiben Sie einen Unit-Test für die Methode
add
des Wrappers. Er soll zwei Threads verwenden, die nebenläufig derselben gewrappten Liste Elemente mitadd
hinzufü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-ParameterT
der KlasseSynchWrapper<T>
zu verwenden, da er nur gebunden wird, wenn die Klasse instanziiert wird. Auf die KlassenmethodesynchronizedList
wird 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 compare
in 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.”)↩︎