Предположим, у меня есть база открытой иерархии, в которой все свойства делегированы одной карте:
interface JsonExternalizable {
fun serialize(): MutableMap<String, JsonNode>
}
abstract class AbstractJsonExternalizable protected constructor(private val map: Map<String, Any?>) : JsonExternalizable {
override fun serialize(): MutableMap<String, JsonNode> {
// ...
}
}
Теперь образец неизменяемой реализации (Я хочу иметь дополнительный вторичный конструктор, в котором список аргументов будет "отражать" соответствующие свойства типа):
open class Bean1 protected constructor(map: Map<String, Any?>) : AbstractJsonExternalizable(map) {
constructor(property1: String,
property2: Int,
property3: Boolean) : this(mapOf(Bean1::property1 to property1,
Bean1::property2 to property2,
Bean1::property3 to property3).mapKeys { it.key.name })
val property1: String by map
val property2: Int by map
val property3: Boolean by map
}
Ситуация ухудшается для более "отдаленных" потомков, так как я должен перечислить каждое свойство супертипа (вместе со своими собственными свойствами) во вторичном конструкторе:
class Bean3 private constructor(map: Map<String, Any?>) : Bean1(map) {
val propertyX: Array<Byte> by map
constructor(property1: String,
property2: Int,
property3: Boolean,
propertyX: Array<Byte>) : this(mapOf(Bean3::property1 to property1,
Bean3::property2 to property2,
Bean3::property3 to property3,
Bean3::propertyX to propertyX).mapKeys { it.key.name })
}
Существует ли более элегантный способ выразить ту же идею с меньшим количеством стандартного кода?