Kotlin中如何从枚举类随机获取元素并返回其text属性?
解决Kotlin中随机获取枚举元素text属性的问题
咱们先拆解下你代码里的几个小问题,再一步步修正到符合需求的状态:
问题分析
- 枚举构造参数未暴露为可访问属性:你的
Answer枚举类里的text: String没有加val修饰,这意味着这个参数只是构造时的临时值,外部根本访问不到text属性,必须加上val才能让它成为枚举实例的公开属性。 - 随机索引范围错误:
rand.nextInt(3)+1会生成1-3的数字,但Answer.values()返回的数组有4个元素(YES、No、MAYBE、AGAIN),数组索引是从0开始的0-3,这样写会直接导致索引越界异常。正确的做法是基于数组长度生成随机索引:rand.nextInt(answers.size)。 - 枚举元素访问方式错误:
Answer[answers[n]]是完全错误的写法,answers本身就是Answer类型的数组,直接通过answers[n]就能拿到对应的枚举实例,再访问它的text属性即可。
修正后的完整代码
import kotlin.random.Random class Answers { enum class Answer(val text: String) { // 给text加上val,将其暴露为枚举的属性 YES("Yes."), NO("No."), // 统一枚举常量大写命名,符合Kotlin编码规范 MAYBE("Maybe."), AGAIN("Ask again.") } private val answers = Answer.values() private val rand = Random() fun genAnswer(): String { val randomIndex = rand.nextInt(answers.size) // 基于数组长度生成安全的随机索引 return answers[randomIndex].text // 直接通过索引获取枚举实例,读取text属性 } }
额外优化小技巧
如果你的项目使用Kotlin 1.3及以上版本,还可以用更简洁的写法直接获取随机元素,省去手动生成索引的步骤:
fun genAnswer(): String { return answers.random().text }
另外把answers和rand标记为private,可以隐藏类的内部实现细节,更符合封装原则。
内容的提问来源于stack exchange,提问作者sfy
相关产品推荐
相关产品推荐

