深入学习 Kotlin 枚举的进阶用法:简洁又高效~

news/2024/5/18 22:37:22 标签: kotlin, android, 枚举, enum

在这里插入图片描述

翻译自:https://towardsdev.com/mastering-enums-in-kotlin-a-guide-to-simplify-your-code-130b5934cb16

Kotlin 作为现代的、强大的编程语言,可以给开发者提供诸多特性和工具,得以帮助我们编写更加高效、更具可读性的代码。

其中一个重要的特性便是 Enum 枚举,其本质上是一种数据类型:允许你定义一组用名称区分的常量

本篇文章将通过代码案例带你探索 Kotlin 枚举的进阶用法,进而帮助大家理解如何将 Enum 更好地应用到项目当中。

1. 枚举

可以说 Enum Classes 是 Kotlin 中展示一组常量的绝佳方式。

具体来说,它允许你定义一组有限数量的成员来限定数据类型,并且你可以在代码的各处便捷使用这些枚举类型。

如下,我们用 enum 关键字定义一周内各天的枚举类型。

kotlin">enum class DayOfWeek {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

然后在代码中自由使用该枚举,比如:

kotlin">fun getWeekendDays(): List<DayOfWeek> {
    return listOf(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY)
}

2. 枚举属性

除了展示类型,Kotlin Enum 还可以拥有属性 property,这意味着开发者可以给枚举成员添加额外的信息。

比如下面,我们给 DayOfWeek 枚举增加各天在周内的序号属性。

kotlin">enum class DayOfWeek(val number: Int) {
    MONDAY(1),
    TUESDAY(2),
    WEDNESDAY(3),
    THURSDAY(4),
    FRIDAY(5),
    SATURDAY(6),
    SUNDAY(7)
}

然后便可以获得该天的序号信息。

kotlin">fun getDayNumber(day: DayOfWeek): Int {
    return day.number
}

3. 枚举函数

Kotlin Enum 也支持定义函数,所以可以在枚举内部定义功能性方法、供外部使用。

如下在 DayOfWeek 枚举里增加一个用来判断该天是否属于周末的 isWeekend() 函数。

kotlin">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
    }
}

在使用该枚举的地方,便可以直接使用该函数进行判断。

kotlin">fun printDayType(day: DayOfWeek) {
    if (day.isWeekend()) {
        println("$day is a weekend day.")
    } else {
        println("$day is a weekday.")
    }
}

4. 枚举构造函数

既然 Enum 可以拥有属性,那么自然支持构造函数,所以开发者可以在实例构造的时候,增加充分多的信息。

比如,我们在 DayOfWeek 枚举的构造函数里,在序号以外增加该天的名称信息。

kotlin">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
    }
}

这样便可以获得该枚举携带的名称数据。

kotlin">fun printDayName(day: DayOfWeek) { 
    println("The day of the week is ${day.displayName}") 
}

5. 枚举扩展函数

和普通类一样,也可以针对 Enum Class 添加扩展函数。我们可以在枚举类外部,按需添加额外的功能函数。

比如这里给 DayOfWeek 枚举扩展一个获取下一天的函数。

kotlin">fun DayOfWeek.nextDay(): DayOfWeek {
    return when (this) {
        MONDAY -> TUESDAY
        TUESDAY -> WEDNESDAY
        WEDNESDAY -> THURSDAY
        THURSDAY -> FRIDAY
        FRIDAY -> SATURDAY
        SATURDAY -> SUNDAY
        SUNDAY -> MONDAY
    }
}

像调用枚举本身定义的函数一样,自由使用该扩展函数。

kotlin">fun printNextDay(day: DayOfWeek) {
    println("The next day is ${day.nextDay()}")
}

结语

可以看到 Kotlin Enum 可以帮助开发者定义好一组类型的常量:大大简化代码、具备更好的可读性以及提供额外的功能函数。

通过上述的进阶用法,相信大家可以使用 Enum 创造出更加健壮和高效的代码,同时也更容易理解和维护。


http://www.niftyadmin.cn/n/301448.html

相关文章

【Java面试】Java基础-注解和反射相关知识点

文章目录 1. 注解的作用&#xff1f;2. 注解的分类&#xff1f;3. 什么是反射&#xff1f;4. 反射如何使用&#xff1f; 1. 注解的作用&#xff1f; 注解是Java中的一种元数据机制&#xff0c;可以用来为程序中的代码元素&#xff08;类、方法、变量等&#xff09;提供额外的信…

基于springboot+mysql+jpa+html实现商品销售信息系统

基于springbootmysqljpahtml实现商品销售信息系统 一、系统介绍1、系统主要功能&#xff1a;2.涉及技术框架&#xff1a;3.本项目所用环境&#xff1a; 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能&#xff1a; 订单管理模块 商品管理模块 品牌管理模…

《程序员面试金典(第6版)》面试题 16.16. 部分排序(double双指针(多指针),C++)

题目描述 给定一个整数数组&#xff0c;编写一个函数&#xff0c;找出索引m和n&#xff0c;只要将索引区间[m,n]的元素排好序&#xff0c;整个数组就是有序的。注意&#xff1a;n-m尽量最小&#xff0c;也就是说&#xff0c;找出符合条件的最短序列。函数返回值为[m,n]&#xf…

PHP实现短网址功能附代码

使用PHP实现短网址功能&#xff0c;支持短网址生成及跳转功能&#xff0c;暂不支持短网址解析&#xff0c;可以自定义开发反解析功能。实现原理是依据26个小写字母26个大写字母0-9数字&#xff0c;组成随机字符串。共计支持500多亿的组合模式&#xff0c;段时间内够用户使用。 …

知识推理——CNN模型总结

记录一下我看过的利用CNN实现知识推理的论文。 最后修改时间&#xff1a;2023.05.08 目录 1.ConvE 1.1.解决的问题 1.2.优势 1.3.贡献与创新点 1.4.方法 1.4.1 为什么用二维卷积&#xff0c;而不是一维卷积&#xff1f; 1.4.2.ConvE具体实现 1.ConvE 论文&#xff1a…

从SpringBoot迁移到Quarkus

从SpringBoot迁移到Quarkus 近期将一个小程序从Spring boot迁移到了Quarkus。之所以决定进行迁移&#xff0c;一是想尝试一些新的Java语法和框架&#xff1b;二是程序比较小&#xff0c;迁移成本低。选择Quarkus的原因也有两点&#xff1a;一是对native image的支持较好。二是…

ePWM模块-时基模块(2)

ePWM模块(2) 时基模块的使用 TBPRD:周期寄存器 (设置的时钟周期存入此,可通过阴影寄存器缓冲后写入,也可通过活动寄存器立即写入) TBCTR:时基计数变值寄存器 (时基当前所计数的值存入,用于和所设定周期值比较) TBPHS:时基相位寄存器 TBSTS:时基状态寄存器 …

数据结构与算法基础(王卓)(35):交换排序之快排【第二阶段:标准答案、初步发现问题】

目录 第二阶段&#xff1a;一分为二 整个快排算法的程序运行大框架&#xff1a; 做出的改动&#xff08;和原来程序的区别&#xff09;&#xff1a; Project 1: PPT标准答案&#xff1a; Project 1小问题&#xff1a; Project 1还存在着一个巨大的问题&#xff1a; 具体问…