Maps in Groovy (Schlüsseldefinition)

Die Definition einer Map in Groovy ist eine einfache Angelegenheit: def map = ["key": "value"]. Doch wie definiert man eine Map in der die Keys nicht als String-Literale, sondern als Variablennamen angegeben werden sollen.

Da Groovy intuitiv ist würde man Folgendes ausprobieren:

public final static String FREE = "Free"
public final static String BASIC = "Basic"
public final static String PLUS = "Plus"
public final static String PREMIUM = "Premium"
public final static String MAX = "Max"
 
public final static LICENSE_DATA = [
    FREE:    [ user: 10,   storage: 100,     course: 3,   fee: 0      ],
    BASIC:   [ user: 200,  storage: 2 *1024, course: 20,  fee: 2500   ],
    PLUS:    [ user: 500,  storage: 5 *1024, course: 50,  fee: 5000   ],
    PREMIUM: [ user: 2000, storage: 20*1024, course: 200, fee: 100000 ],
    MAX:     [ user: 5000, storage: 50*1024, course: 500, fee: 200000 ]
]

Dieses Beispiel definiert 5 Konstanten die den Namen einer Lizenz speichern und wir definieren eine Map, die zu jeder Lizenz bestimmte Informationen enthält. Um den Namen der Lizenz in der Definition der Map nicht doppelt zu schreiben geben wir für die Keys die Variablennamen der Konstanten an. Dies funktioniert in Groovy aber nicht.

Bei der Definition einer Map wird die Key-Definition nicht als Ausdruck ausgewertet, sondern trotz fehlender Anführungszeichen als String. Für unser Beispiel bedeutet es, dass in der Map LICENSE_DATA.FREE aber nicht LICENSE_DATA.Free hinterlegt ist.

Mit einem kleinen Kniff kann man sich aber behelfen.

public final static String FREE = "Free"
public final static String BASIC = "Basic"
public final static String PLUS = "Plus"
public final static String PREMIUM = "Premium"
public final static String MAX = "Max"
 
public final static LICENSE_DATA = [
    (FREE):    [ user: 10,   storage: 100,     course: 3,   fee: 0      ],
    (BASIC):   [ user: 200,  storage: 2 *1024, course: 20,  fee: 2500   ],
    (PLUS):    [ user: 500,  storage: 5 *1024, course: 50,  fee: 5000   ],
    (PREMIUM): [ user: 2000, storage: 20*1024, course: 200, fee: 100000 ],
    (MAX):     [ user: 5000, storage: 50*1024, course: 500, fee: 200000 ]
]

Mit den runden Klammern (FREE) entsteht ein Ausdruck der auch ausgewertet wird. Man kann also mittels LICENSE_DATA.Free auf den Eintrag zugreifen.


Anregungen und Hinweise sind herzlich willkommen, schreibt mir unter @code_hx


Büro

ImpactHub Dresden
Bayrische Straße 8
01069 Dresden

Post

Dr.-Ing. Stefan Urbansky
HxCode
Dresdner Landstr. 30e
01728 Bannewitz