2009-09-25 9 views
23

W kodzie Groovy poniżej zastąpić wartościami feck, arse, drink właściwości instancji Foo z tych instancji Foo2nieruchomość Groovy iteracji

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" 
} 

Czy istnieje lepszy sposób to zrobić ? Moja szczególna obawa związana z powyższym kodem polega na tym, że nazwy właściwości są przechowywane jako ciągi na liście, które prawdopodobnie zostałyby utracone, gdy (na przykład) za pomocą IDE refaktoryzacji, aby zmienić jedną z tych nazw właściwości.

+2

Dlaczego nie „że byłoby ekumeniczny materia”;)? –

Odpowiedz

27

Nie znalazłem jeszcze dobrego podejścia do wykluczania właściwości tylko do odczytu (np. MetaClass, klasa), ale jeśli chcesz ustawić wartość wszystkich właściwości w instancji Foo, które są również w instancji Foo2 możesz wykonać następujące czynności.

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

czy możesz mi pomóc, jak sprawdzić typ nieruchomości? – Pushkar

4

bardzo późno odpowiedź ... jednak co do podjęcia tylko non syntetyczny declaredFields z Foo klasie. Korzystanie z podejścia:

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" 

W razie zmiany refactoring coś dla przykładu w Foo ale nie w Foo2 wtedy Exception zostanie wyrzucony z tego kodu informujący, że coś jest nie tak.

Powiązane problemy