在 Kotlin中,枚举使用关键词enum, enum class对应Java中的enum,Kotlin中,enum 又叫做软关键词(soft keyword):当它出现在 class 之前时,它就有了特殊的含义。但是你可以在其他地方把它当做常规名字来使用。另一方面,class依然是一个关键词。你依然需要把变量命名为(class关键字以外的名
字) clazz 或aClass。像ava那样,枚举类型并不是一个值的列表:你可以在枚举类中声明属性和方法。
声明一个枚举:
enum class Color(
val r: Int, val g: Int, val b: Int // 1 声明枚举常量的属性
) {
RED(255, 0, 0), ORANGE(255, 265, 0), // 2 当每个常量被创建时指定属性值
YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
INDIGO(75, 0, 130), VIOLET(238, 130, 238); // 3 分号(;)在这里是必须的
fun rgb() = (r * 256 + g) * 256 + b // 4 在枚举类中定义了一个方法
}
枚举常量使用了跟在常规类中声明构造函数和属性同样的语法。当声明每一个枚举常量时,需要为常量提供属性值。注意,这个示例中展示了 Kotlin 语法中唯一一处需要你使用分号的地方:如果你在枚举类中定义了任何方法,(请使用)分号将枚举常量列表从函数定义中分隔开来。
模拟我们项目开发中最常用的一种场景:客户端和服务器约定几种类型,然后不同的类型展示不同的样式,在Java中,基本都会使用switch语句或者if-else表达式,但在Kotlin中,我们可以使用更加强大的when表达式,例如:根据输入的color,我们输出color的名字:
fun getColorName(color: Color) = // 1 直接返回一个when表达式
when (color) { // 2 如果颜色等于枚举常量,返回对应的字符串
Color.RED -> "Richard"
Color.ORANGE -> "Of"
Color.YELLOW -> "York"
Color.GREEN -> "Grave"
Color.BLUE -> "Battle"
Color.INDIGO -> "In"
Color.VIOLET -> "Vain"
}
上面这样使用了枚举常量的完整名称,指定了Color枚举类名。当然我们也可以直接通过导入常量值的方式来简化代码:
顶层包导入:
import com.example.admin.kotlindemo.Color.*
然后就可以通过名字来使用常量:
fun getWarmth(color: Color) = when (color) {
RED, ORANGE, YELLOW -> "warm" // 3 通过名字来使用常量
GREEN -> "neutral"
BLUE, INDIGO, VIOLET -> "cold"
}
注:为什么我们这里函数体的定义直接使用了when表达式呢?因为kotlin中 when 是一个返回值的表达式,因此一个有表达式主体的函数可以直接返回when表达式
让我们来回忆一下Android开发中最常出现的一种场景:
假设我们有个User类
public class User {
private int age;
private String name;
private int sex;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
}
TextView要显示他的基本信息:
Java我们一般会拼接成字符串或者使用格式化形式,例如:
User user = new User();
String sex;
if (user.getSex() == 0) {
sex = "男";
} else {
sex = "女";
}
textView.setText(user.getName() + "的性别是:" + sex);
是不是很麻烦?但是在Kotlin中,我们只需要:
textview.text = "${user.name}的性别是${if(user.sex==0) "男" else "女"}"
以上的示例介绍了叫做字符串模板的特性。在代码中,我们可以像很多脚本语言一样,在字符串值中通过在变量名前面放置$
字符来引用局部变量或者表达式。这相当于Java的字符串串拼接,但是更加紧凑和高效。当然,表达式是静态检查的。如果尝试着去应用一个不存在的变量,代码不会通过编译。如果你需要在一个字符串中包含 $
符号,你可以使用转义功能: println(“$x”) ,打印 $x 但不会讲 x 解析为变量引用。上面的使用字符串模板的时候使用了一个简单的表达式,并且在双引号内部嵌套了双引号,当然也可以仅仅使用表达式或者字符串变量。