09.05.2012

Quick & Dirty - Initialisierung einer unveränderlichen Map

Dem einen oder anderen Entwickler wird vielleicht die Initialisierung einer Map als Konstante in einer Klasse über den Weg gelaufen sein.

Für die Realisierung sind unterschiedliche Wege denkbar. Zum einen bietet sich die Initialisierung durch einen statischen Block an, so dass die Map beim Laden der Klassen innerhalb des Blocks initialisiert wird. Das ist ein möglicher Weg, der sicherlich auch legitim ist.

Eine andere Möglichkeit, die an dieser Stelle aufgezeigt werden soll, ist die Initialisierung mit Hilfe einer anonymen Klasse.

Als Beispiel hält diesmal ein kleiner Imbiss her der verschiedene Gerichte auf der Speisekarte hat.


Der Imbiss (SnackPoint) verkauft verschiedene Snacks, die global in einer Enumeration (Snack) definiert sind. Wird eine Bestellung ausgeführt, bekommt der Nutzer über den Rückgabewert der Methode mitgeteilt welchen Betrag er nun bezahlen muss. Sollte ein Snack nicht vorhanden sein, so wird eine SnackNotAvailableException ausgelöst. Getestet wird die kleine Anwendung mit Hilfe eines einfachen JUnit Tests.

Der für diesen Post spannende Teil ist allerdings nur die Initialisierung der Speisekarte (MENU). Der kleine Snackpoint ist ein global operierendes Unternehmen, der in allen Fillialen die gleiche Speisekarte mit gleichen Preisauszeichnungen anbietet. Daher sollte diese als statische Konstante hinterlegt werden.


Die Initialisierung soll ja nun, wie oben bereits beschrieben, über eine anonyme Klasse realisiert werden.



Nun müssen nur noch die Daten eingepflegt werden. Innerhalb der anonymen Klassen wird also ein Instanzinitalisierer (Initialisierungsblock) angelegt, der genau für eine solche Arbeit geeignet ist.


Damit ist die Speisekarte initialisert und kann bereits genutzt werden. Spannend wäre nun ja noch, dass die Speisekarte auch nach außen hin sichtbar ist und von jedem Kunden vor Bestellung eingesehen werden kann. Wird die Map allerdings öffentlich gemacht, besteht die Gefahr, dass diese auch von außen geändert wird. Eine Lösung wäre, dass die Map über die Collections-API als unveränderbar gekennzeichnet wird.


Sollte der Versuch gewagt werden die Speisekarte von außen zu ändern, so wird dieser Versuch mit einer UnsupportedOperationException fehlschlagen.


Damit ist die Speisekarte initialisiert, von außen im Lesezugriff nutzbar und trotzdem nicht veränderlich.

Keine Kommentare:

Kommentar veröffentlichen