(これは一緒にスローされます。大幅に拡張/カプセル化できます。)
デフォルトの ctor はマップを取得するため、埋め込みオブジェクトの名前プレフィックスを吸い取って、各オブジェクトに必要なパラメーター マップを作成するのが最も簡単です。
class Object1 {
int go
String s
String toString() {
"<<${super.toString()}: go=${go}, s=${s}>>"
}
}
class ObjectA {
int cool
Object1 b
String toString() {
"<<${super.toString()}: cool=${cool}, b=${b}>>"
}
}
params = [cool: 1, object1go: 3, object1s: 'hello']
// Params for embedded object.
o1params = params.findAll { it.key.startsWith("object1") }
// Embedded object's property names (the above map minus the prefix).
tmp1 = o1params.collectEntries { k, v -> [(k[7..-1]): v] }
// "Parent" object's params.
oaparams = params - o1params
oa = new ObjectA(oaparams + [b: new Object1(tmp1)])
println oa.toString()
これを強化する方法はたくさんありますが、どれも非常に簡単で簡単です。たとえば、"object1"
名前と長さをハードコーディングしました。これは、汎用メソッドや DSL などにまとめることができます。プロパティ名は、クラスから直接取得できます。これをよりきれいにする方法はたくさんあります。
ただし、CSV からマップ名を変更できる場合は、JSON などの中間ステップを検討し、代わりにそれから逆シリアル化するだけです。