【Kotlin 初学者】枚举类-密封类-数据类-继承(上)

简介: 目录一、枚举类1.1 创建枚举类1.2 获取枚举相关信息1.3 枚举类添加属性1.4 定义函数1.5 以泛型的方式访问枚举类中的常量1.6 代数数据类型(ADT)二、密封类(sealed class)2.1 创建密封类2.2 使用


一、枚举类


       枚举类,用来定义常量集合的一种特殊类。使用 enum class 可以声明一个枚举类


1.1 创建枚举类


       枚举常量用逗号分隔,每个枚举常量都是一个对象


enum class Color{
    RED,
    BULE,
    YELLOW
}
fun main() {
    //使用
    println(Color.RED)
}


微信图片_20220524203005.png


1.2 获取枚举相关信息


val name: String //获取枚举名称,,默认名称为枚举字符名
val ordinal: Int //获取枚举值在所有枚举数组中定义的顺序,值从 0 开始


fun main() {
    //使用
    val blue = Color.BULE
    println(blue.name)
    println(blue.ordinal)
}


微信图片_20220524203046.png


1.3 枚举类添加属性


       每一个枚举都是枚举类的实例,它们可以被初始化。

       若需要指定值,则可以使用其构造函数。


//2.0版本
enum class Color2(val user: UserColor) {
    RED(UserColor("小红", 15)),
    BULE(UserColor("小蓝", 20)),
    YELLOW(UserColor("小黄", 30));
}
data class UserColor(val name: String, val age: Int)
fun main() {
    //2.0版本
    println(Color2.BULE.user)
}


微信图片_20220524203204.png


1.4 定义函数


enum class Color2(val user: UserColor) {
    ...
    RED(UserColor("小红", 15));
    fun addUser(adduser:UserColor)=
        UserColor("${adduser.name}-${user.name}"
            ,adduser.age+user.age)
}
fun main() {
    //枚举定义函数
    println(Color2.RED.addUser(UserColor("新", 40)))
}


微信图片_20220524203235.png


1.5 以泛型的方式访问枚举类中的常量


       Kotlin 1.1 起,可以使用 enumValues()enumValueOf()函数以泛型的方式访问枚举类中的常量


@SinceKotlin("1.1")
public inline fun <reified T : Enum<T>> enumValues(): Array<T>
/**
 * Returns an enum entry with specified name.
 */
@SinceKotlin("1.1")
public inline fun <reified T : Enum<T>> enumValueOf(name: String): T
//使用
fun main() {
    println(enumValueOf<Color>("RED"))
    println(enumValues<Color2>().joinToString { it.user.toString() })
}

微信图片_20220524203405.png


1.6 代数数据类型(ADT)


       可以用来表示一组子类型的闭集,枚举类就是一种简单的ADT。

       使用枚举的关键好处在于使用 when 表达式的时候,如果能够 验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了。


enum class ColorADT {
    RED,
    BULE,
    YELLOW
}
class TakeColor(var colorADT: ColorADT) {
    fun selectColor(): String {
        return when (colorADT) {
            ColorADT.RED -> "红色"
            ColorADT.BULE -> "蓝色"
            ColorADT.YELLOW -> "黄色"
             // 不再需要 `else` 子句,因为我们已经覆盖了所有的情况
        }
    }
}
fun main() {
    println(TakeColor(ColorADT.BULE).selectColor())
}


微信图片_20220524203437.png


 但是如果我们想在返回是红色的时候给一个提示。如果使用枚举类,那么还需要判断就有一些复杂了。对于更复杂的ADT,你可以使用Kotlin的密封类(sealed class)来实现更复杂的定义。


二、密封类(sealed class)


  • 对于更复杂的ADT,你可以使用Kotlin的密封类(sealed class)来实现更复杂的定义,密封类可以用来定义一个类似于枚举类的ADT,但你可以更灵活地控制某个子类型。


  • 密封类可以有若干个子类,要继承密封类,这些子类必须和它定义在同一个文件里。


  • sealed 关键字不能修饰 interface ,abstract class(会报 warning,但是不会出现编译错误)


2.1 创建密封类


sealed class ColorSealed{
    //以下都是密封类的子类
    //使用object用的是单例,因为下面两个子类没有属性,不管生成多少次都一样
    object Blue : ColorSealed()
    object Yellow : ColorSealed()
    //这个子类有属性,可能属性不同,所以要生成不同的对象
    class Red(val toast:String) : ColorSealed()
}


2.2 使用


       使用密封类的关键好处在于使用 when 表达式的时候,如果能够 验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了。


1.class TakeColorSealed(var colorSealed: ColorSealed) {
    fun selectColor(): String {
        return when (colorSealed) {
            is ColorSealed.Blue -> "蓝色"
            is ColorSealed.Yellow -> "黄色"
            is ColorSealed.Red ->
                "红色,${(this.colorSealed as ColorSealed.Red).toast}"
            //不再需要 else 子句,因为我们已经覆盖了所有的情况
        }
    }
}
fun main() {
    println(TakeColorSealed(ColorSealed.Blue).selectColor())
    println("----------")
    println(TakeColorSealed(ColorSealed.Red("警告警告!!!")).selectColor())
}


这里跟枚举类的使用不太一样。用到了 is 关键字


       调用红色提示的时候将当前的ColorSealed转换为ColorSealed.Red,因为编译时也不知道你传入的是Red还是其他的。



相关文章
|
Kotlin
Kotlin教程笔记(20) - 枚举与密封类
Kotlin教程笔记(20) - 枚举与密封类
142 8
|
Java Kotlin
Kotlin教程笔记(12) - 面向对象之继承与实现
Kotlin教程笔记(12) - 面向对象之继承与实现
146 4
|
Java Kotlin
Kotlin教程笔记(13) - 类及成员的可见性
Kotlin教程笔记(13) - 类及成员的可见性
174 3
|
存储 前端开发 Java
Kotlin教程笔记(18) - 数据类
Kotlin教程笔记(18) - 数据类
|
Java 开发者 Kotlin
Kotlin教程笔记(2) - 类与构造器
Kotlin教程笔记(2) - 类与构造器
133 1
|
数据安全/隐私保护 Kotlin
Kotlin教程笔记(7) - 类成员
Kotlin教程笔记(7) - 类成员
|
9月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
393 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
449 1
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
754 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
514 1