如何在Kotlin中通过变量动态更新Player类的属性
解决方案:动态更新Player类的指定属性
方案1:用when表达式直接判断(最直观)
先修正你代码里的小问题:Kotlin规范里类名首字母要大写(比如Player而非player),变量名首字母小写(team而非Team),还有=+是笔误,应该是+=。
直接通过when判断你传入的属性名称,对应更新就行:
data class Player( val name: String = "", var goals: Int = 0, var assists: Int = 0 ) val testPlayerName: String = "Bob" val goalsOrAssists: String = "goals" // 这里替换成用户输入的字符串 fun main() { var team: List<Player> = listOf( Player(name="Dave", goals=0, assists=0), Player(name="Bob", goals=0, assists=0), Player(name="Barry", goals=0, assists=0), Player(name="Bill", goals=0, assists=0) ) team.forEach { player -> if (player.name == testPlayerName) { // 用lowercase避免大小写问题 when (goalsOrAssists.lowercase()) { "goals" -> player.goals += 1 "assists" -> player.assists += 1 // 以后要加「踢围栏次数」,直接在这里加分支就行 else -> println("不认识的统计项:$goalsOrAssists") } } } println(team) }
方案2:把更新逻辑封装到Player类(推荐,易扩展)
如果以后要加更多统计项(比如你说的踢围栏次数),把更新逻辑放到Player类里会更清晰,也方便维护:
data class Player( val name: String = "", var goals: Int = 0, var assists: Int = 0, var fencesKicked: Int = 0 // 提前加上踢围栏次数 ) { // 专门写个方法处理统计项递增 fun incrementStat(statType: String) { when (statType.lowercase()) { "goals" -> goals += 1 "assists" -> assists += 1 "fences_kicked" -> fencesKicked += 1 else -> println("无效的统计项:$statType") } } } fun main() { val testPlayerName = "Bob" val statToUpdate = "assists" // 用户输入的目标统计项 val team = listOf( Player("Dave"), Player("Bob"), Player("Barry"), Player("Bill") ) team.forEach { player -> if (player.name == testPlayerName) { player.incrementStat(statToUpdate) } } println(team) }
方案3:反射方式(不推荐简单场景使用)
如果你的统计项特别多,不想写一堆when分支,可以用反射,但反射性能差,而且容易出错,只适合复杂场景:
import kotlin.reflect.full.memberProperties data class Player( val name: String = "", var goals: Int = 0, var assists: Int = 0 ) fun main() { val testPlayerName = "Bob" val statToUpdate = "goals" val team = listOf( Player("Dave"), Player("Bob"), Player("Barry"), Player("Bill") ) team.forEach { player -> if (player.name == testPlayerName) { // 通过反射找到对应的属性 val property = Player::class.memberProperties.find { it.name == statToUpdate } if (property is kotlin.reflect.KMutableProperty<*>) { val currentValue = property.get(player) as Int property.set(player, currentValue + 1) } else { println("统计项$statToUpdate不存在或者是只读的") } } } println(team) }
额外提示
- Kotlin里
List是不可变集合,但修改集合中对象的属性是允许的(因为存的是对象引用);如果以后要添加/删除球员,建议用MutableList。 - 用
lowercase()处理用户输入可以避免大小写不一致的问题(比如用户输入"Goals"也能识别)。
内容的提问来源于stack exchange,提问作者Chris Woodfield
相关产品推荐
相关产品推荐

