© Excellent backgrounds/Shutterstock.com
Java Magazin
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].

Sven Ruppert, Heinz Kabutz


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.

Abb. 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 JavaObjektgrößen in Java können mit der folgenden Formel abgeschätzt werden:12 Bytes für den Objektkopf4 Bytes für jeden Zeiger8 Bytes für lange und doppelte Felder4 Bytes für int- und float-Felder2 Bytes für Kurz- und Zeichenfelder1 Byte für Byte und Boole'sche FelderAuß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 { 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.

Abb. 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 CustomHashMap implements CustomMap { private final Map map = new HashMap(); { System.out.println("CustomHashMap constructed"); } @Override public int size() { return map.size(); } @Override public V get(Object key) { return map.get(key); } @Override public V put(K key, V value) { return map.put(key, value); } @Ove...

Java Magazin
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].

Sven Ruppert, Heinz Kabutz


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.

Abb. 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 JavaObjektgrößen in Java können mit der folgenden Formel abgeschätzt werden:12 Bytes für den Objektkopf4 Bytes für jeden Zeiger8 Bytes für lange und doppelte Felder4 Bytes für int- und float-Felder2 Bytes für Kurz- und Zeichenfelder1 Byte für Byte und Boole'sche FelderAuß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 { 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.

Abb. 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 CustomHashMap implements CustomMap { private final Map map = new HashMap(); { System.out.println("CustomHashMap constructed"); } @Override public int size() { return map.size(); } @Override public V get(Object key) { return map.get(key); } @Override public V put(K key, V value) { return map.put(key, value); } @Ove...

Neugierig geworden?


    
Loading...

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