2009-09-25 7 views
23

Im Groovy-Code unten ich die Werte der feck, arse, drink Eigenschaften einer Instanz Foo mit denen einer Instanz von Foo2Groovy Eigenschaft Iteration

class Foo { 
    def feck = "fe" 
    def arse = "ar" 
    def drink = "dr"  
} 

class Foo2 { 

    def feck = "fe2" 
    def arse = "ar2" 
    def drink = "dr2" 
} 


def f = new Foo() 
def f2 = new Foo2() 


["feck", "arse", "drink"].each {it -> 
    f."$it" = f2."$it" 
} 

Gibt es einen besseren Weg, dies zu tun ersetzen ? Meine spezielle Sorge mit dem obigen Code ist, dass die Eigenschaftsnamen als Strings in einer Liste gespeichert werden, die wahrscheinlich übersehen würden, wenn (zum Beispiel) eine Refactoring-IDE verwendet wird, um einen dieser Eigenschaftsnamen zu ändern.

+2

Warum nein, "das wäre eine ökumenische Angelegenheit";)? –

Antwort

27

Ich habe noch keinen guten Ansatz zum Ausschließen der schreibgeschützten Eigenschaften gefunden (dh metaClass, Klasse), aber wenn Sie den Wert aller Eigenschaften in der Foo-Instanz festlegen möchten, die sich auch in der Foo2-Instanz befinden Sie könnten Folgendes tun.

class Foo { 
    def feck = "fe" 
    def arse = "ar" 
    def drink = "dr"  
} 

class Foo2 { 

    def feck = "fe2" 
    def arse = "ar2" 
    def drink = "dr2" 
} 


def f = new Foo() 
def f2 = new Foo2() 


f2.properties.each { prop, val -> 
    if(prop in ["metaClass","class"]) return 
    if(f.hasProperty(prop)) f[prop] = val 
} 

assert f.feck == "fe2" 
assert f.arse == "ar2" 
assert f.drink == "dr2" 
+0

können Sie mir bitte helfen, wie zu prüfen ist Eigenschaftstyp? – Pushkar

4

Sehr spät Antwort ... aber was ist nur die nicht synthetischendeclaredFields von Foo Klasse zu nehmen. Arbeiten mit dem Ansatz:

class Foo { 
    def feck = "fe" 
    def arse = "ar" 
    def drink = "dr"  
} 

class Foo2 { 
    def feck = "fe2" 
    def arse = "ar2" 
    def drink = "dr2" 
} 


def f = new Foo() 
def f2 = new Foo2() 

Foo.declaredFields.findAll { !it.synthetic }*.name.each {it -> 
    f[it] = f2[it] 
} 

assert f.feck == "fe2" 
assert f.arse == "ar2" 
assert f.drink == "dr2" 

Wenn in Refactoring etwas ändert zum Beispiel in Foo aber nicht in Foo2 dann einem Exception wird von diesem Code ausgelöst werden, die Empfehlung, dass etwas nicht stimmt.