博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kotlin杂记之延迟初始化和密封类
阅读量:3957 次
发布时间:2019-05-24

本文共 1747 字,大约阅读时间需要 5 分钟。

前言

该博客是《第三行代码》第三版第4章Kotlin部分的笔记,方便记忆和复习

Kotlin延迟初始化和密封类

一、对变量延迟初始化

如果类中存在很多全局变量实例,为了保证它们能够满足Kotlin的空指针检查语法标准,就必须做许多的非空判断才行,即使我们可以确保它不为空。

class Test {	private var adapter: MsgAdapter? = null	override fun onCreate() {		···		adapter = MsgAdapter(msgList)		····	}	override fun onClick() {		···		adapter?.notify();		···	}}

延迟初始化使用的是lateinit关键字,它可以告诉Kotlin编译器,我们会在晚些时候对这个变量进行初始化,这样就不用在一开始的时候将它赋值为null了

class Test {	private lateinit var adapter: MsgAdapter	override fun onCreate() {		···		adapter = MsgAdapter(msgList)		····	}	override fun onClick() {		···		adapter.notify();		···	}}

我们在adapter变量前面加上lateinit关键字,这样就不用一开始就将它赋值为null了,同时类型声明也就可以改成MsgAdapter了,由于MsgAdapter是不可空类型,这样子在onClick中就可以不用进行判空处理了。

使用lateinit并不是没有风险的,如果我们adapter还没有初始化的情况下直接使用它,那么程序就一定会崩溃,并且抛出一个UninitializedPropertyAccessException异常

我们可以通过代码来判断一个全局变量是否已经完成了初始化,这样子就能避免一个变量重复进行初始化。

class Test {	private lateinit var adapter: MsgAdapter	override fun onCreate() {		···		if(!::adapter.isInitialized) {			adapter = MsgAdapter(msgList)		}		····	}	override fun onClick() {		···		adapter.notify();		···	}}

::adapter.isInitialized可用于判断adapter是否已经初始化

二、密封类

定义如下一段代码:

interface Resultclass Success(val msg: String) : Resultclass Failure(val error: Exception) : Result

再定义一个getResultMsg()方法

fun getResultMsg(result: Result) = when (result) {	is Success -> result.msg	is Failure -> result.error.message	else -> throw IllegalArgumentException()}

由于语法的限制,我们不得不编写一个else语句,尽管这个else语句永远不可能运行。

可以使用密封类解决该问题

密封类的关键字是sealed class,我们可以将Result接口改造成密封类

sealed class Resultclass Success(val msg: String) : Result()class Failure(val error: Exception) : Result()

这样子,getResultMsg()方法中的else条件已经不再需要了。

fun getResultMsg(result: Result) = when (result) {	is Success -> result.msg	is Failure -> result.error.message}

转载地址:http://adtzi.baihongyu.com/

你可能感兴趣的文章
JSON 基础
查看>>
J2EE监听器Listener接口大全[转]
查看>>
cookie、session、sessionid 与jsessionid[转]
查看>>
常见Oracle HINT的用法
查看>>
JAVA中各类CACHE机制实现的比较 [转]
查看>>
PL/SQL Developer技巧
查看>>
3-python之PyCharm如何新建项目
查看>>
15-python之while循环嵌套应用场景
查看>>
17-python之for循环
查看>>
18-python之while循环,for循环与else的配合
查看>>
19-python之字符串简单介绍
查看>>
20-python之切片详细介绍
查看>>
P24-c++类继承-01详细的例子演示继承的好处
查看>>
P8-c++对象和类-01默认构造函数详解
查看>>
P1-c++函数详解-01函数的默认参数
查看>>
P3-c++函数详解-03函数模板详细介绍
查看>>
P4-c++函数详解-04函数重载,函数模板和函数模板重载,编译器选择使用哪个函数版本?
查看>>
P5-c++内存模型和名称空间-01头文件相关
查看>>
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>