加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

复制Groovy类属性

发布时间:2020-12-14 16:35:31 所属栏目:大数据 来源:网络整理
导读:我想通过一般的方式将对象属性复制到另一个对象(如果一个属性存在于目标对象上,我将从源对象中复制它). 我的代码工作正常使用ExpandoMetaClass,但我不喜欢的解决方案.还有其他方法吗? class User { String name = 'Arturo' String city = 'Madrid' Integer
我想通过一般的方式将对象属性复制到另一个对象(如果一个属性存在于目标对象上,我将从源对象中复制它).

我的代码工作正常使用ExpandoMetaClass,但我不喜欢的解决方案.还有其他方法吗?

class User {
    String name = 'Arturo'
    String city = 'Madrid'
    Integer age = 27
}

class AdminUser {
    String name
    String city
    Integer age
}

def copyProperties(source,target) {
    target.properties.each { key,value ->
        if (source.metaClass.hasProperty(source,key) && key != 'class' && key != 'metaClass') {
            target.setProperty(key,source.metaClass.getProperty(source,key))
        }
    }
}

def (user,adminUser) = [new User(),new AdminUser()]
assert adminUser.name == null
assert adminUser.city == null
assert adminUser.age == null

copyProperties(user,adminUser)
assert adminUser.name == 'Arturo'
assert adminUser.city == 'Madrid'
assert adminUser.age == 27

解决方法

我认为你的解决方案是非常好的,是在正确的轨道.至少我觉得很容易理解.

该解决方案的更多的succint版本可能是…

def copyProperties(source,target) {
    source.properties.each { key,value ->
        if (target.hasProperty(key) && !(key in ['class','metaClass'])) 
            target[key] = value
    }
}

…但并没有根本的不同.我正在迭代源属性,所以我可以使用值分配给目标:).它可能比原来的解决方案不那么强大,因为我认为如果目标对象定义了一个getAt(String)方法,它将会破坏.

如果你想得到这个想法,你可能会这样做:

def copyProperties(source,target) {
    def (sProps,tProps) = [source,target]*.properties*.keySet()
    def commonProps = sProps.intersect(tProps) - ['class','metaClass']
    commonProps.each { target[it] = source[it] }
}

基本上,它首先计算两个对象之间的公共属性,然后复制它们.它也有效,但我认为第一个更直接,更容易理解:)

有时少是多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读