Kotlin中如何在when语句中比较枚举类属性与main函数内的变量
问题解决:Kotlin枚举类菜单匹配when语句写法
原有代码错误点
- when语句传入匹配变量
option后,分支不需要写option = xxx的赋值语句,直接填写匹配值即可 - 同个作用域下不能定义两个同名的
Menu枚举类,可根据需求二选一使用
方案1:使用带构造属性的枚举实现(更推荐,写法简洁)
枚举类定义:
enum class Menu(val optionName: String, val getOption: Int){ SALDO("Saldo", 1), SACAR("Sacar", 2), DEPOSITAR("Depositar", 3), EXTRATO("Extrato", 4), SAIR("Sair", 5) }
正确的main函数when写法:
fun main() { val clienteFundo = fundo() val clienteDados = cliente() var option: Int = 1 when(option){ Menu.SALDO.getOption -> println("test") // 匹配option等于1的情况 Menu.SACAR.getOption -> println("执行取款逻辑") Menu.DEPOSITAR.getOption -> println("执行存款逻辑") Menu.EXTRATO.getOption -> println("执行查询账单逻辑") Menu.SAIR.getOption -> println("退出程序") else -> println("输入的选项不合法") } }
如果想简化分支写法,可以给枚举加伴生对象方法,直接根据输入的Int转换为对应的枚举实例:
enum class Menu(val optionName: String, val getOption: Int){ SALDO("Saldo", 1), SACAR("Sacar", 2), DEPOSITAR("Depositar", 3), EXTRATO("Extrato", 4), SAIR("Sair", 5); companion object { fun getByOption(option: Int): Menu? { return values().find { it.getOption == option } } } }
调用时写法更清晰:
when(Menu.getByOption(option)){ Menu.SALDO -> println("test") Menu.SACAR -> println("执行取款逻辑") // 其他分支同理 null -> println("输入的选项不合法") }
方案2:使用实现GetMenu接口的枚举实现
先定义对应接口:
interface GetMenu { fun getMenu(): Int }
枚举类定义:
enum class Menu: GetMenu{ SALDO{ override fun getMenu() = 1 }, SACAR{ override fun getMenu() = 2 }, DEPOSITAR{ override fun getMenu() = 3 }, EXTRATO{ override fun getMenu() = 4 }, SAIR{ override fun getMenu() = 5 } }
对应的when写法:
when(option){ Menu.SALDO.getMenu() -> println("test") // 其他分支同理 else -> println("输入的选项不合法") }
内容的提问来源于stack exchange,提问作者Cyperpath
相关产品推荐
相关产品推荐

