gpt4 book ai didi

class - 复制 Groovy 类属性

转载 作者:行者123 更新时间:2023-12-03 15:06:02 25 4
gpt4 key购买 nike

我要将对象属性复制到另一个对象 以通用方式(如果目标对象上存在属性,我从源对象复制它)。

我的代码使用 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

最佳答案

我认为您的解决方案非常好,并且在正确的轨道上。至少我觉得可以理解。

该解决方案的更简洁版本可能是......

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

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

有时少即是多。

关于class - 复制 Groovy 类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9072307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com