Kotlin-枚举和“when”

时间:2021-7-21 作者:qvyue

声明枚举类

《Kotlin实战》中关于颜色枚举类的,举例代码。

enum class Color {
    RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}

和Java一样,枚举并不是值的列表:可以给枚举类声明属性和方法。引用《Kotlin实战中》举例代码:

enum class Color(
    var r: Int,
    val g: Int,
    val b: Int
) {
    RED(255, 0, 0), ORANGE(255, 165, 0),
    YELLOW(255, 255, 0), GREEN(0, 255, 0),
    BLUE(0, 0, 255), INDIGO(75, 0, 135), VIOLET(238, 130, 238);

    fun rgb() = (r * 265 + g) * 265 + b
}

fun main() {
    println(Color.BLUE.rgb())
}

《Kotlin实战》中这样介绍到:枚举常量用的声明构造方法和属性的语法与之前你看到的常规类一样。当你声明每个枚举常量的时候,必须提供该常量的属性值。注意这个例子向你展示了 Kotlin 语法中唯一必须使用分号的地方如果要在枚举类中定义任何方法,就要使用分号把枚举常量列表和方法定义分开。

使用when处理枚举类

《Kotlin实战》中举例一个彩虹有关的例子。Red、Orange、Yellow、Green、Blue、Indigo、Violet,假设你需要一个函数来告诉每个颜色的中文意思。在Java中可以用switch语句完成,而Kotlin对应的结构是when。

if语句相似,when是一个有返回值的表达式,因此可以写成一个直接返回when表达式体的函数。下面就贴例子的代码(我仿照书中的例子写的):

fun getMnemonic(color: Color) = when (color) {
    Color.RED -> "红色"
    Color.ORANGE -> "橙色"
    Color.YELLOW -> "黄色"
    Color.GREEN ->"绿色"
    Color.BLUE ->"蓝色"
    Color.INDIGO -> "靛蓝"
    Color.VIOLET -> "紫色"
}

fun main() {
    println(getMnemonic(Color.GREEN))
}

上面的代码根据传进来的 color 值找到对应的分支。和 Java不一样,你不需要在每个分支写上break 语句 Java 中遗漏 break通常会导致 bug 如果匹配成功,只有对应的分支会执行也可以把多个值合并到同个分支,只需要用逗号隔开这些值。改写书中的例子:

fun getWarmth(color: Color) = when (color) {
    Color.RED, Color.ORANGE, Color.YELLOW -> "暖色调"
    Color.GREEN -> "中性色调"
    Color.BLUE, Color.INDIGO, Color.VIOLET ->"冷色调"
}

fun main() {
    println(getWarmth(Color.GREEN))
}

希望我这篇文章对学习Kotlin的小伙伴有帮助。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。