最近在看DataStore源码时,看到一种类似于枚举的使用方式。就是Sealed类,但是比枚举类更有扩展性,除了拥有共享属性,还可以持有特征属性。

1、通常限定一些有限集合的状态值.
      如: 网络状态:成功,失败.
            账户状态:vip,普通.
2、与when配合使用,无需if-else

先讲两个使用案例:

第一个案例:


/*** Represents the current state of the DataStore.*/
private sealed class State<T>private object UnInitialized : State<Any>()/*** A read from disk has succeeded, value represents the current on disk state.*/
private class Data<T>(val value: T, val hashCode: Int) : State<T>() {fun checkHashCode() {check(value.hashCode() == hashCode) {"Data in DataStore was mutated but DataStore is only compatible with Immutable types."}}
}/*** A read from disk has failed. ReadException is the exception that was thrown.*/
private class ReadException<T>(val readException: Throwable) : State<T>()/*** The scope has been cancelled. This DataStore cannot process any new reads or writes.*/
private class Final<T>(val finalException: Throwable) : State<T>()

上述代码中,UnInitialized,Data,ReadException,Final都是State的四种不同状态。相当于,枚举类State,有这四个状态成员。

State状态类,虽然没有共享属性,但是可以有;

UnInitialized状态类,虽然没有特征属性,但是也可以有;

Data状态类,有特征属性:value, hashcode;

ReadException状态类,有特征属性:readException;

Final状态类,有特征属性finalException。

当然也可以有属于自己的方法,Data状态类有就:fun checkHashCode().

使用时可以这样使用:

密封类通常与表达式一起使用。

在判断出状态类型后,根据自带的特有属性顺便在状态里把事情做了。

                when (it) {is ReadException<T> -> throw it.readExceptionis Final<T> -> throw it.finalExceptionis Data<T> -> it.valueis UnInitialized -> error("This is a bug in DataStore. Please file a bug at: " +"https://issuetracker.google.com/issues/new?" +"component=907884&template=1466542")}

有没有发现?不需要else处理default,因为编译器知道Sealed类的所有子状态类,就没必要了。这是区别于普通类的情况。

第二个案例:

这个案例是想说, 通过扩展函数还可以做进一步的判断,执行更多的业务。

sealed class Result<out R> {data class Success<out T>(val data: T) : Result<T>()data class Error(val throwable: Throwable?) : Result<Nothing>()object Loading : Result<Nothing>()override fun toString(): String {return when (this) {is Success<*> -> "Success[data=$data]"is Error -> "Error[throwable=$throwable]"Loading -> "Loading"}}
}val Result<*>.succeededget() = this is Success && data != nullfun <T> Result<T>.successOr(fallback: T): T {return (this as? Success<T>)?.data ?: fallback
}val <T> Result<T>.data: T?get() = (this as? Success)?.datainline fun <reified T> Result<T>.updateOnSuccess(stateFlow: MutableStateFlow<T>) {if (this is Success) {stateFlow.value = data}
}

总结一下Sealed类:

  • 密封类以及它的子类最好都定义在同一个文件中,这样会更加内聚。但不是必须的! 最新的kotlin版本只要求同Module、同包名
  • 密封类隐式是一个无法实例化的抽象类。
  • 它用于表示受限制的类层次结构。
  • 当对象具有来自有限集的类型之一,但不能具有任何其他类型时。这是使用密封类。类似于枚举使用的地方。
  • 密封类的构造函数在默认情况下是私有的,它也不能允许声明为非私有。
  • 对比普通类,Sealed类自动生成toString、hashCode、equals函数;
  • 结合扩展函数做更进一步的事情。

从1.5开始,有增加了Sealed接口。没有任何成员定义的Sealed类,可以用Sealed接口替代。

Kotlin学习笔记(十一)Sealed类和Sealed接口相关推荐

  1. Kotlin学习笔记12——数据类和密封类

    Kotlin学习笔记12--数据类和密封类 前言 数据类 在类体中声明的属性 复制 componentN 解构声明 密封类 尾巴 前言 上一篇,我们学习了Kotlin中的拓展,今天继续来学习Kotli ...

  2. Kotlin学习笔记 第二章 类与对象 第十一节 枚举类 第八节密封类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  3. Kotlin学习笔记 第二章 类与对象 第七节 数据类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  4. Kotlin学习笔记 第二章 类与对象 第十四 十五节 委托 委托属性

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  5. Kotlin学习笔记 第二章 类与对象 第三节接口 第四节 函数式接口

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  6. Kotlin学习笔记 第二章 类与对象 第一节类与继承(补)

    参考链接 Kotlin官方文档 Kotlin docs | Kotlin 本系列为参考Kotlin中文文档 kotlin官方文档2020版.pdf-其它文档类资源-CSDN下载 第二章 第一节 类与继 ...

  7. Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  8. Kotlin学习笔记 第二章 类与对象 第十节 内部类嵌套类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  9. Kotlin学习笔记 第二章 类与对象 第五节 可见性 第六节 扩展

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  10. Kotlin学习笔记 第二章 类与对象 第二节属性

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

最新文章

  1. face detection[PyramidBox]
  2. 初识Mongodb总结
  3. win10 查看文件扩展名 - 教程篇
  4. 联创宽带上网助手协议的简单分析(三):密码包的构造过程
  5. 常见文件文件头文件尾格式总结及各类文件头
  6. 服务器注册表被管理员禁用,win10中如何修复被管理员或病毒禁用的注册表编辑器...
  7. Android技术开发 必备网站及使用工具
  8. 记一次菜鸟网络电话面试
  9. 太帅了!钟楚曦这件老爹裤A到炸裂,一般人可穿不出这种范
  10. shopee虾皮注册很难吗?shopee虾皮注册有哪些注意事项?
  11. java:JDBC的使用与封装
  12. win10系统ipv6服务器地址,Win10关闭iPv6地址方法
  13. 怎样判断一个P2P平台是否靠谱?
  14. Linux下给python3安装库
  15. wfGo 围棋 AI对弈模式
  16. 苹果皮被“山寨”:iPhone也能支持4G网络
  17. 程序人生:请不要推卸责任
  18. 【剑指offer】leetcode刷题 -- Python3实现 -- 共75题(更新中)
  19. 根据时间戳获取相应的日期和时间
  20. Altium Designer 常用快捷键

热门文章

  1. table的样式设置
  2. windows启动盘
  3. 使用MySQL的binlog日志恢复误删数据
  4. Oracle恢复误删数据
  5. Unicode特殊字符编码
  6. LeetCode算法日记:340.至多包含K个不同字符的最长子串
  7. 信仰:生或者死——读海子、史铁生
  8. MapX学习基本教程
  9. apache安装过程
  10. 作为一个准研究生,怎样才能在研究生阶段不虚度?