一、 lateinit 延迟初始化
/**
* DESC : lateinit 延迟初始化
*/
class KtBaseLateinit01 {
companion object {
const val TAG = "KtBaseLateinit01"
}
//错误写法,未指定变量类型,info 无法再修改类型了,还怎么延迟初始化?
// lateinit var info
//正确写法:先指定变量类型,暂不赋值,等用到了再赋值
lateinit var info : String
fun requestInfo() {
//延迟初始化,属于懒加载,用到了再赋值
info = "请求信息"
Log.d(TAG, "requestInfo==>info="+info)
}
fun requestInfoResult() {
/**
* 如果info 未被初始化,只要用到info,就会崩溃,报下面的属性未初始化异常,
* 所以对于lateinit var修饰的变量,不能采用这样方式判断
* Caused by: kotlin.UninitializedPropertyAccessException: lateinit property info has not been initialized
*/
/*if (info != null) {
Log.d(TAG, "requestInfoResult==>info="+info)
}*/
/**
* 正确写法如下:
* 针对lateinit var修饰的变量,判空操作
* ::info是属性KProperty0调用,isInitialized
* 不能采用info.isInitialized
*/
if (::info.isInitialized) {
Log.d(TAG, "info已经初始化,值为="+info)
} else {
Log.d(TAG, "info 未初始化")
}
}
/**
* 测试结果:
*
* info 未初始化
*/
fun testRequestInfo01() {
//使用info之前不进行懒加载初始化
// requestInfo()
requestInfoResult()
}
/**
* 测试结果:
* requestInfo==>info=请求信息
* info已经初始化,值为=请求信息
*/
fun testRequestInfo02() {
//使用info之前,进行懒加载初始化
requestInfo()
requestInfoResult()
}
}
二、by lazy惰性初始化(区别于lateinit)
/**
* DESC : by lazy惰性初始化(区别于lateinit)
*/
class KtBaseByLazy01 {
companion object {
const val TAG = "KtBaseByLazy01"
}
//普通方式:不使用惰性初始化 by lazy,没有任何懒加载的特点
// val data1 = getDbData()
//普通方式:使用惰性进行初始化
val data by lazy {
getDbData()
}
fun getDbData() : String {
Log.d(TAG, "getDbData==>获取数据中...")
return "get db data success"
}
fun testByLazy() {
Log.d(TAG, "testByLazy==>test by lazy")
Thread.sleep(5000)
Log.d(TAG, "testByLazy==>data="+data)
}
}
网友评论