2009-09-25 8 views
23

내가 Foo2그루비 코드에서 그루비 재산 반복

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

의 인스턴스의 사람들과 Foo의 인스턴스의 feck, arse, drink 속성 값을 대체 아래는이 작업을 수행하는 더 좋은 방법이 있나요 ? 위의 코드에 대한 나의 특정한 관심은 속성 이름이 목록에 문자열로 저장된다는 것입니다. 예를 들어 리팩터링 IDE를 사용하여 이러한 속성 이름 중 하나를 변경할 때 누락 될 가능성이 있습니다.

+2

왜 "아니 에큐메니칼 문제가 되겠습니까?")? –

답변

27

아직 읽기 전용 속성 (예 : metaClass, 클래스)을 제외하는 좋은 방법을 찾지 못했지만 Foo 인스턴스의 Foo2 인스턴스에있는 모든 속성의 값을 설정하려는 경우 당신은 다음을 할 수 있습니다.

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

당신이 저를 도울 수 있습니까, 어떻게 확인하는 속성 유형입니까? – Pushkar

4

매우 늦게 대답 ... 그러나에 대해 만 비 합성declaredFieldsFoo 클래스의 취할. 당신의 접근 방식 사용 : Foo에 예를 들어 뭔가 변화를 리팩토링에

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" 

만약을하지만 Foo2에서는 다음 Exception는 뭔가 잘못이라고 조언이 코드에서 발생합니다.