深入学习Kotlin 枚举的简洁又高效进阶用法
作者:TechMerger 发布时间:2022-11-05 02:39:11
引言
翻译自:towardsdev.com/mastering-e…
Kotlin 作为现代的、强大的编程语言,可以给开发者提供诸多特性和工具,得以帮助我们编写更加高效、更具可读性的代码。
其中一个重要的特性便是 Enum
枚举,其本质上是一种数据类型:允许你定义一组用名称区分的常量。
本篇文章将通过代码案例带你探索 Kotlin 枚举的进阶用法,进而帮助大家理解如何将 Enum
更好地应用到项目当中。
1. 枚举类
可以说 Enum Classes 是 Kotlin 中展示一组常量的绝佳方式。
具体来说,它允许你定义一组有限数量的成员来限定数据类型,并且你可以在代码的各处便捷使用这些枚举类型。
如下,我们用 enum 关键字定义一周内各天的枚举类型。
enum class DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
然后在代码中自由使用该枚举,比如:
fun getWeekendDays(): List<DayOfWeek> {
return listOf(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY)
}
2. 枚举属性
除了展示类型,Kotlin Enum 还可以拥有属性 property,这意味着开发者可以给枚举成员添加额外的信息。
比如下面,我们给 DayOfWeek
枚举增加各天在周内的序号属性。
enum class DayOfWeek(val number: Int) {
MONDAY(1),
TUESDAY(2),
WEDNESDAY(3),
THURSDAY(4),
FRIDAY(5),
SATURDAY(6),
SUNDAY(7)
}
然后便可以获得该天的序号信息。
fun getDayNumber(day: DayOfWeek): Int {
return day.number
}
3. 枚举函数
Kotlin Enum 也支持定义函数,所以可以在枚举内部定义功能性方法、供外部使用。
如下在 DayOfWeek
枚举里增加一个用来判断该天是否属于周末的 isWeekend() 函数。
enum class DayOfWeek(val number: Int) {
MONDAY(1),
TUESDAY(2),
WEDNESDAY(3),
THURSDAY(4),
FRIDAY(5),
SATURDAY(6),
SUNDAY(7);
fun isWeekend(): Boolean {
return this == SATURDAY || this == SUNDAY
}
}
在使用该枚举的地方,便可以直接使用该函数进行判断。
fun printDayType(day: DayOfWeek) {
if (day.isWeekend()) {
println("$day is a weekend day.")
} else {
println("$day is a weekday.")
}
}
4. 枚举构造函数
既然 Enum 可以拥有属性,那么自然支持构造函数,所以开发者可以在实例构造的时候,增加充分多的信息。
比如,我们在 DayOfWeek
枚举的构造函数里,在序号以外增加该天的名称信息。
enum class DayOfWeek(val number: Int, val displayName: String) {
MONDAY(1, "Monday"),
TUESDAY(2, "Tuesday"),
WEDNESDAY(3, "Wednesday"),
THURSDAY(4, "Thursday"),
FRIDAY(5, "Friday"),
SATURDAY(6, "Saturday"),
SUNDAY(7, "Sunday");
override fun toString(): String {
return displayName
}
}
这样便可以获得该枚举携带的名称数据。
fun printDayName(day: DayOfWeek) {
println("The day of the week is ${day.displayName}")
}
5. 枚举扩展函数
和普通类一样,也可以针对 Enum Class 添加扩展函数。我们可以在枚举类外部,按需添加额外的功能函数。
比如这里给 DayOfWeek
枚举扩展一个获取下一天的函数。
fun DayOfWeek.nextDay(): DayOfWeek {
return when (this) {
MONDAY -> TUESDAY
TUESDAY -> WEDNESDAY
WEDNESDAY -> THURSDAY
THURSDAY -> FRIDAY
FRIDAY -> SATURDAY
SATURDAY -> SUNDAY
SUNDAY -> MONDAY
}
}
像调用枚举本身定义的函数一样,自由使用该扩展函数。
fun printNextDay(day: DayOfWeek) {
println("The next day is ${day.nextDay()}")
}
来源:https://juejin.cn/post/7230775751125205029


猜你喜欢
- PopupWindow是一个弹出式窗口,它可以展示任意View。他会浮在当前窗口的上方展示。下面看代码:public class MyAct
- 引用类型包含值类型字段,引用类型初始化后,值类型默认会被初始化为0、Null。 CLR允许为值类型定义构造器,但是构造器的调用,就必须显式的
- 会报错如下:org.springframework.web.util.NestedServletException: Request pro
- 本文实例为大家分享了Android Studio实现帧动画的具体代码,供大家参考,具体内容如下按一定的顺序播放静态的图片1、几张联系的图片2
- 在编写程序,我们经常会对一些时间进行比较,比如要搜寻一个时间范围中的数据,需要用户输入开始时间和结束时间,如果结束时间小于或等于开始时间,那
- BufferedInputStream BufferedInputStream 是缓冲输入流。它继承于FilterInputSt
- BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存
- 电话号码输入框需求:三位,七位后有空格删除倒数第四,第八位会将空格也删除使用TextWatcherWhen an object of a t
- 状态转移方程:d(i,j) = min(d(i,j),d(i,k)+d(k,j)),其中i<k<j思路对于每一个k(i<k
- 本文实例讲述了Android编程实现拍照功能的2种方法。分享给大家供大家参考,具体如下:Android系统的照相功能,已实现2种方法,可供大
- 这是我们用得比较多的一种设计模式,也是23种标准设计模式之一,使用前面讲的简单工厂设计模式,遇到具体产品经常变换时就不太适合了,违反了开闭设
- 前言最近接了一个项目,甲方不愿意买服务器,但是呢,项目又必须要用文件功能。所以很巧,最近又刚好看到了Minio这个牛逼的工具。正好借此机会记
- 使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置,最后加上立牌编号。步骤:1).
- 最开始接触到相关的内容应该是从volatile关键字开始的吧,知道它可以保证变量的可见性,而且利用它可以实现读与写的原子操作。。。但是要实现
- hello,今天给大家带来一道算法题。这道算法题,是我目前为止,见过最难的一道题。那么到底是怎样的一道算法题呢?如下:题目:给定一个数组,
- 对于简单的场景来讲,在MEF中导入依赖模块非常简单,只要用ImportAttribute标记依赖的成员,MEF模块会自动找到并创建该模块。但
- ForkJoinTask就是ForkJoinPool里面的每一个任务。他主要有两个子类:RecursiveAction和RecursiveT
- 动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问
- 本文实例分析了C#中Convert.ToString和ToString的区别,对于初学者来说是很有必要加以熟练掌握的。具体分析如下:1.Co
- 超链接即内容链接,通过给特定对象设置超链接,可实现载体与特定网页、文件、邮件、网络等的链接,点击链接载体可打开链接目标,在文档处理中是一种比