Делегирование собственности по карте для открытых иерархий - PullRequest
0 голосов
/ 21 ноября 2018

Предположим, у меня есть база открытой иерархии, в которой все свойства делегированы одной карте:

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

Существует ли более элегантный способ выразить ту же идею с меньшим количеством стандартного кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...