2009-09-25 20 views
23

En el código Groovy continuación puedo reemplazar los valores de los feck, arse, drink propiedades de una instancia de Foo con los de una instancia de Foo2propiedad maravillosa iteración

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

¿Hay una mejor manera de hacer esto ? Mi preocupación específica con el código anterior es que los nombres de las propiedades se almacenan como cadenas en una lista, lo que probablemente se perderá cuando (por ejemplo) se utilice un IDE de refactorización para cambiar uno de estos nombres de propiedad.

+2

¿Por qué no, "eso sería un asunto ecuménico";)? –

Respuesta

27

Todavía no he encontrado un buen enfoque para excluir las propiedades de solo lectura (es decir, metaClass, clase), pero si desea establecer el valor de todas las propiedades en la instancia de Foo que también están en la instancia de Foo2 podrías hacer lo siguiente

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

¿me puede ayudar por favor, cómo comprobar es el tipo de propiedad? – Pushkar

4

respuesta muy tarde ... sin embargo lo que a punto de tomar solamente los no sintéticadeclaredFields de Foo clase. Usando su método:

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" 

Si en cambio algo refactorización por ejemplo en Foo pero no en Foo2 a continuación, un Exception serán lanzados desde este código aconsejando que algo está mal.