Update random class attribute in Kotlin

安稳与你 提交于 2021-02-08 10:13:48

问题


I have a class with some attributes:

class DonutBox {
    var glaze: Int = 0
    var chocolate: Int = 0
    var maple: Int = 0
    var etc: Int = 0
}

fun addDonuts() {
    val omNom = DonutBox()
}

How can I increment a random attribute of the instantiated class?

For instance, if the randomly selected attribute is chocolate, then effectively:

omNom.chocolate += 1

回答1:


Because Kotlin's properties are statically declared, and you want to use them dynamically, most of the methods to do that will involve reflection, which can get pretty messy and difficult to understand.

When you want dynamic data, it's probably better to use a map:

val donutBox = mutableMapOf(
    "glaze" to 0,
    "chocolate" to 0,
    "maple" to 0,
    "etc" to 0,
)

val randomKey = donutBox.keys.random()
donutBox[randomKey] = donutBox.getValue(randomKey) + 1

println(donutBox)

Output:

{glaze=0, chocolate=0, maple=1, etc=0}

That said, if you really want to use reflection, you can do it like this:

data class DonutBox(
    var glaze: Int = 0,
    var chocolate: Int = 0,
    var maple: Int = 0,
    var etc: Int = 0,
)

fun addDonuts() {
    val omNom = DonutBox()
    val randomProperty = omNom::class.declaredMemberProperties.random() as KMutableProperty1<DonutBox, Int>
    val existing = randomProperty.get(omNom)
    randomProperty.set(omNom, existing + 1)
    println(omNom)
}

fun main() {
    addDonuts()
    addDonuts()
    addDonuts()
}

Output:

DonutBox(glaze=0, chocolate=1, maple=0, etc=0)
DonutBox(glaze=0, chocolate=0, maple=0, etc=1)
DonutBox(glaze=0, chocolate=1, maple=0, etc=0)


来源:https://stackoverflow.com/questions/64852115/update-random-class-attribute-in-kotlin

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!