【问题标题】:Groovy property iterationGroovy 属性迭代
【发布时间】:2016-04-27 18:54:00
【问题描述】:

在下面的 Groovy 代码中,我将 Foo 实例的 feckarsedrink 属性的值替换为 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"
}

有没有更好的方法来做到这一点?我对上面代码的特别关注是,属性名称作为字符串存储在列表中,当(例如)使用重构 IDE 更改这些属性名称之一时,可能会丢失这些名称。

【问题讨论】:

  • 为什么不,“那将是一个普世的事情”;)?

标签: groovy


【解决方案1】:

我还没有找到排除只读属性(即元类、类)的好方法,但是如果你想设置 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"

【讨论】:

  • 你能帮我看看,如何检查属性类型?
【解决方案2】:

很晚的答案......但是只需要 非合成 declaredFieldsFoo 类。使用您的方法:

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"

如果在重构过程中发生了某些变化,例如 Foo 而不是 Foo2,则此代码中会抛出一个 Exception,告知有问题。

【讨论】:

  • 不错! findAll{ !it.synthetic } 过滤 metaClassclass 等属性
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2019-02-11
相关资源
最近更新 更多