上一篇:Kotlin一步一步學(xué)(二) -- 標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法
延遲初始化
如果你的類中存在很多全局變量時鸵闪,為了保證它們能通過Kotlin的空指針檢查語法,你不得不做許多的非空判斷才行,即使你非常確定它們不會為空。那么這個問題有沒辦法解決竖般?答案是肯定的咬扇,那就是對全局變量進(jìn)行延遲初始化。
延遲初始化就是在變量聲明前使用lateinit
關(guān)鍵字撇寞,它可以告訴Kotlin編譯器呻袭,我會在晚些時候?qū)@個變量進(jìn)行初始化眨八,然后就不用在一開始的時候?qū)⑺x值為null,并且不用在調(diào)用的地方做非空的判斷。
原始的寫法
class MainActivity : AppCompatActivity(), View.OnClickListener {
private var adapter: MyAdapter? = null //沒有進(jìn)行初始化左电,類型后面必須加一個廉侧?,并且賦值為null
override fun onCreate(savedInstanceState: Bundle?) {
...
adapter = Mydapter(mylist)
}
override fun onClick(v: View?) {
...
adapter?.notifyItemInserted(mylist.size - 1) //調(diào)用adapter的時候要進(jìn)行判空
}
}
lateinit延遲初始化寫法
class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var adapter: MyAdapter //使用lateinit進(jìn)行延遲初始化聲明篓足,不需要賦值為null
override fun onCreate(savedInstanceState: Bundle?) {
...
adapter = Mydapter(mylist)
}
override fun onClick(v: View?) {
...
adapter.notifyItemInserted(mylist.size - 1) //調(diào)用adapter的時候不需要進(jìn)行判空
}
}
當(dāng)你對一個全局變量使用了lateinit關(guān)鍵字時段誊,請一定要確保它在被任何調(diào)用前已經(jīng)完成了初始化,否則程序就會拋出
UninitializedPropertyAccessException
異常纷纫。
我們可以API來判斷一個全局變量是否已經(jīng)完成了初始化枕扫,這樣可以避免報錯和重復(fù)對某個變量進(jìn)行初始化陪腌。對上面示例進(jìn)行優(yōu)化
class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var adapter: MyAdapter //使用lateinit進(jìn)行延遲初始化聲明辱魁,不需要賦值為null
override fun onCreate(savedInstanceState: Bundle?) {
...
if (!::adapter.isInitialized) //判斷adapter是否已經(jīng)初始化
adapter = Mydapter(mylist)
}
}
密封類
密封類用來表示受限的類繼承結(jié)構(gòu):當(dāng)一個值為有限幾種的類型烟瞧、而不能有任何其他類型時。在某種意義上染簇,他們是枚舉類的擴(kuò)展:枚舉類型的值集合也是受限的参滴,但每個枚舉常量只存在一個實(shí)例,而密封類的一個子類可以有可包含狀態(tài)的多個實(shí)例锻弓。
要聲明一個密封類砾赔,需要在類名前面添加 sealed 修飾符。雖然密封類也可以有子類青灼,但是所有子類都必須在與密封類自身相同的文件中聲明暴心。
sealed class Result
class Success(val msg: String) : Result()
class Failure(val error : Exception) : Result()
使用密封類的關(guān)鍵好處在于使用when
表達(dá)式的時候,如果驗(yàn)證語句覆蓋了所有情況杂拨,就不需要為該語句再添加一個 else
子句了专普。
fun getResult(result: Result) : String = when(expr) {
is Success -> result.msg
is Failure -> "Error is ${result.error.message}"
// 不再需要 else 子句,因?yàn)槲覀円呀?jīng)覆蓋了所有的情況
}
sealed經(jīng)常用于在adapter中和viewHolder一起使用弹沽,達(dá)到簡化adapter代碼的效果檀夹。
下一篇:一步一步學(xué)(四)