使用映射初始化时,无法为groovy中的类设置只读属性:class
我试图创建一个类并用默认值初始化所有值。我在groovy中有这个pojo,我创建了initializeWithDefaults方法来初始化所有的值。我试图在构造函数中传递map使用映射初始化时,无法为groovy中的类设置只读属性:class,groovy,Groovy,我试图创建一个类并用默认值初始化所有值。我在groovy中有这个pojo,我创建了initializeWithDefaults方法来初始化所有的值。我试图在构造函数中传递map class MDS { String id String mdsName String name String mdsType String mdsContext String mdsDateTime String mdsDomain public sta
class MDS {
String id
String mdsName
String name
String mdsType
String mdsContext
String mdsDateTime
String mdsDomain
public static void initializeWithDefaults() {
MDS dataSegmentIdDef = new MDS()
Map<String, Object> prop = dataSegmentIdDef.properties
prop.each { Map.Entry entry->
entry.value = "default-${entry.key}"
}
MDS dataSegmentId = new MDS(prop)
}
}
一个快速修复方法是使用
findAll
方法过滤掉已经有值的属性
public static void initializeWithDefaults() {
MDS dataSegmentIdDef = new MDS()
Map<String, Object> prop = dataSegmentIdDef.properties.findAll { !it.value }
prop.each { Map.Entry entry->
entry.value = "default-${entry.key}"
}
MDS dataSegmentId = new MDS(prop)
}
当您试图重写作为
getClass()
提供的HashMap
的class
属性时,就会出现错误
您应该注意,您要复制哪些属性。Groovy控制台中的一个简单实验如下(请注意!prop.synthetic
):
以及输出:
Result: default.id:default.mdsName:default.mdsDomain
为什么不跳过“class”属性呢
if(entry.key!='class')entry.value=“default-${entry.key}”
yeah最后只是这样做了,当时正在考虑避免这种情况的方法,或者可能有更好的方法来实现我的目标
Map<String, Object> prop = dataSegmentIdDef.properties
.findAll { !it.value }
.collectEntries { key, noValue -> [key, "default-$key"] }
class MDS {
// your props
@Override
String toString() {
"$id:$mdsName:$mdsDomain"
}
static void initializeWithDefaults() {
MDS mds = MDS.class.declaredFields.inject( new MDS() ){ MDS mds, prop ->
if( !prop.synthetic ) mds[ prop.name ] = "default.$prop.name"
mds
}
println mds
}
}
MDS.initializeWithDefaults()
Result: default.id:default.mdsName:default.mdsDomain