Kotlin lateinit與by lazy案例詳解
lateinit 和 lazy 是 Kotlin 中的兩種不同的延遲初始化的實(shí)現(xiàn)
lateinit 只用于變量 var,而 lazy 只用于常量 val
lazy 應(yīng)用于單例模式(if-null-then-init-else-return),而且當(dāng)且僅當(dāng)變量被第一次調(diào)用的時(shí)候,委托方法才會(huì)執(zhí)行。
lazy()
是接受一個(gè) lambda 并返回一個(gè) Lazy <T>
實(shí)例的函數(shù),返回的實(shí)例可以作為實(shí)現(xiàn)延遲屬性的委托: 第一次調(diào)用 get()
會(huì)執(zhí)行已傳遞給 lazy()
的 lambda 表達(dá)式并記錄結(jié)果, 后續(xù)調(diào)用 get()
只是返回記錄的結(jié)果。
val lazyValue: String by lazy { println("computed!") "Hello" } fun main(args: Array<String>) { println(lazyValue) println(lazyValue) } 打印結(jié)果 computed! Hello Hello
比如這樣的常見(jiàn)操作,只獲取,不賦值,并且多次使用的對(duì)象
private val mUserMannager: UserMannager by lazy { UserMannager.getInstance() }
再比如acitivity中控件初始化的操作,一般傳統(tǒng)的進(jìn)入界面就初始化所有的控件,而使用懶加載,只有用到時(shí)才會(huì)對(duì)控件初始化
//kotlin 封裝: fun <V : View> Activity.bindView(id: Int): Lazy<V> = lazy { viewFinder(id) as V } //acitivity中擴(kuò)展調(diào)用 private val Activity.viewFinder: Activity.(Int) -> View? get() = { findViewById(it) } //在activity中的使用姿勢(shì) val mTextView by bindView<TextView>(R.id.text_view) mTextView.text="執(zhí)行到我時(shí),才會(huì)進(jìn)行控件初始化"
lateinit 則用于只能生命周期流程中進(jìn)行獲取或者初始化的變量,比如 Android 的 onCreate()
@Inject @field:Named("home") lateinit var pagerAdapter:FragmentStatePagerAdapter
再比如
class App : Application() { init { instance = this } @Inject lateinit var apiComponent: ApiComponent override fun onCreate() { super.onCreate() DaggerApiComponent.builder().apiModule(ApiModule()).appModule(AppModule(this)).build().inject(this) } companion object { lateinit var instance: App } }
到此這篇關(guān)于Kotlin lateinit與by lazy案例詳解的文章就介紹到這了,更多相關(guān)Kotlin lateinit與by lazy內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 實(shí)現(xiàn)比較版本號(hào)功能
本篇文章主要介紹了java 中涉及到客戶端的系統(tǒng)經(jīng)常需要用到比較版本號(hào)的功能,并附小示例,希望能幫助需要的小伙伴2016-07-07確保SpringBoot定時(shí)任務(wù)只執(zhí)行一次的常見(jiàn)方法小結(jié)
在Spring Boot項(xiàng)目中,確保定時(shí)任務(wù)只執(zhí)行一次是一個(gè)常見(jiàn)的需求,這種需求可以通過(guò)多種方式來(lái)實(shí)現(xiàn),以下是一些常見(jiàn)的方法,它們各具特點(diǎn),可以根據(jù)項(xiàng)目的實(shí)際需求來(lái)選擇最合適的方法,需要的朋友可以參考下2024-10-10SpringBoot整合Pulsar的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot整合Pulsar的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07mybatis in查詢條件過(guò)長(zhǎng)的解決方案
這篇文章主要介紹了mybatis in查詢條件過(guò)長(zhǎng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10劍指Offer之Java算法習(xí)題精講數(shù)組查找與字符串交集
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03Java網(wǎng)絡(luò)編程之UDP網(wǎng)絡(luò)通信詳解
這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程中的UDP網(wǎng)絡(luò)通信的原理與實(shí)現(xiàn),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09