2011-09-04 5 views
12

Ho un oggetto con diversi campi,Groovy: Avere un nome di campo, è necessario impostare il valore e non vogliono usare l'interruttore

class TestObj { 
    def field1 
    def field2 
} 

ho una coppia di valori v1 = "Field1" e v2 = "valore2" Vorrei impostare v2 nel campo appropriato in base al nome di v1, ma preferirei non doverlo fare con un interruttore o se le istruzioni, continuo a pensare che ci deve essere un "molto più groovy "modo di conseguire il risultato altro che fare qualcosa di simile:

setValues(def fieldName, def fieldVal) { 
    if (fieldName.equals("field1")) { 
    field1 = fieldVal 
    } 
    if (fieldName.equals("field2")) { 
    field2 = fieldVal 
    } 
} 

ho provato a fare questo:

setValues(def fieldName, def fieldVal) { 
    this['${fieldName}'] = fieldVal 
} 

Tuttavia questo non funziona, dicendo che non c'è alcuna proprietà $ {} nomeCampo

Grazie.

+2

Ok, questo funziona: questo [ "$ {fieldName}"] = fieldVal –

+1

'' è stringhe normali e non funzionerà con le macro, '$ è 'sarà semplicemente' $ is 'mentre "$ is" si risolverà nel valore della variabile è. – xlson

risposta

19

È possibile utilizzare gstrings quando si ottiene un campo, come questo:

def obj = new TestObj() 
def fieldToUpdate = 'field1' 
obj."$fieldToUpdate" = 3 
+5

Alla prossima persona che inciampa su questo ... Se si usano le virgolette singole "invece di", non funzionerà. Groovy si sottomette solo a $ quando si utilizzano le virgolette doppie. – RMorrisey

6

in Groovy non c'è bisogno di definire una proprietà di avere una proprietà. Utilizzare getProperty e setProperty chiamati ganci di accesso proprietà in Groovy:

class TestObj { 
    def properties = [:] 
    def getProperty(String name) { properties[name] } 
    void setProperty(String name, value) { properties[name] = value } 

    void setValues(def fieldName, def fieldVal) {setProperty(fieldName, fieldVal)} 
} 

def test = new TestObj() 
test.anyField = "anyValue" 
println test.anyField 

test.setValues("field1", "someValue") 
println test.field1 

test.setValues("field2", "anotherValue") 
println test.field2 
Problemi correlati