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 mit synchronizedList sein, für die Umsetzung aber keine vorgefertigten Wrapper aus (z.B. synchronizedList aus java.util) verwenden:
static List<T> synchronizedList(List<T> list) 
  • Schreiben Sie einen Unit-Test für die Methode add des Wrappers. Er soll zwei Threads verwenden, die nebenläufig derselben gewrappten Liste Elemente mit add hinzufügen. Der Test ist erfüllt, wenn die Anzahl der Elemente der gewrappten Liste der zu erwartenden Anzahl entspricht.

  1. Eine Anmerkung zu der möglicherweise ungewohnten Notation mit <T> in der Methodensignatur von synchronizedList: Es handelt sich um eine Klassenmethode (static). Daher ist es nicht möglich, den Typ-Parameter T der Klasse SynchWrapper<T> zu verwenden, da er nur gebunden wird, wenn die Klasse instanziiert wird. Auf die Klassenmethode synchronizedList 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.”)↩︎