© Swill Klitch/Shutterstock.com
Design Patterns Teil 2: Handgefertigte Proxies

Der LEGO-Kasten für Softwareentwicklung


Proxies gibt es in verschiedenen Formen und Geschmacksrichtungen. So haben wir den Virtual Proxy für Lazy Initialization, den Remote Proxy für den Zugriff auf Objekte in entfernten Adressräumen und den Protection Proxy zum Hinzufügen einer Sicherheitsebene. Die Proxy-Design-Pattern-Struktur aus dem GoF-Buch ist in Abbildung 1 zu sehen [1].

In einigen Situationen möchten wir die Erstellung von Objekten vielleicht so lange hinauszögern, bis sie unbedingt benötigt werden. Das Hinausschieben kann uns sogar die Kosten für die Erstellung von Objekten ganz ersparen. Beispiele für solche Objekte mit hohen Erstellungskosten sind Threads, Datenbankverbindungen, große Arrays und Dateien.

kabutz_designpatterns_2_1.tif_fmt1.jpgAbb. 1: Proxy-Design-Pattern-Struktur aus dem GoF-Buch [1]

Beispielsweise ist eine neue HashMap ohne das Array mit den Einträgen 48 Bytes (Kasten: „Sizeof in Java“) groß. Dieses Array beginnt traditionell bei der Länge 16 und wächst, sobald es mehr als 75 % Belegung hat. Ein Array mit 16 Objekten belegt weitere 80 Bytes. Die Gesamtkosten einer neuen HashMap belaufen sich also auf 128 Bytes, auch wenn die HashMap kein einziges Element enthält.

Sizeof in Java

Objektgrößen in Java können mit der folgenden Formel abgeschätzt werden:

  • 12 Bytes für den Objektkopf

  • 4 Bytes für jeden Zeiger

  • 8 Bytes für lange und doppelte Felder

  • 4 Bytes für int- und float-Felder

  • 2 Bytes für Kurz- und Zeichenfelder

  • 1 Byte für Byte und Boole'sche Felder

Außerdem werden Objekte in 8-Byte-Schritten zugeordnet, siehe auch das Werkzeug Java Object Layout (JOL) [2].

CustomMap

Die CustomMap-Schnittstelle (Listing 1) enthält eine Untermenge von Methoden, die in java.util.Map definiert sind. In der Struktur der Proxy Design Patterns ist CustomMap ein Beispiel für das Subject-Interface.

Listing 1: CustomMap Interface

//:~ src/main/java/../ch02/virtual/CustomMap.java public interface CustomMap<K, V> { int size(); V get(Object key); V put(K key, V value); V remove(Object key); void clear(); void forEach(BiConsumer<? super K, ? super V> action); // etc. }

Die Klassenstruktur unserer CustomMap ist in Abbildung 2 zu sehen.

kabutz_designpatterns_2_2.tif_fmt1.jpgAbb. 2: Klassenstruktur unserer CustomMap

CustomHashMap

CustomHashMap implementiert CustomMap. Da wir das Rad nicht neu erfinden wollen, delegieren wir alle Methoden an eine java.util.HashMap. In der Struktur der Proxy Design Patterns ist CustomHashMap ein Beispiel für die Klasse RealSubject (Listing 2).

Listing 2: CustomHashMap Class

//:~ src/main/java/../ch02/virtual/CustomHashMap.java public class C...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang