我們在對 val
變數進行延遲初始化時,使用 by lazy
將 val
初始化的動作移到需要該變數的時候執行。
其中 by
這個關鍵字,代表的就是委任。
委任 (Delegation)
什麼是委任?白話一點的解釋,就是在某個類別所需要的功能可以交由其他的類別來處理。
假設有一個介面為 Uploader,它定義一個函式 upload
LogUploader
的類別繼承了這個介面,並且實作了這個函式
另一個 ImageUploader
的類別也繼承了這個介面,也同樣實作了這個函式:
當我們需要做上傳 Log 的時候,我們就會使用 LogUploader
類;
而當我們需要上傳 Image 的時候,我們就會使用 ImageUploader
類。
有一個 BackgroundService
類,我們可以將 Uploader 作為參數傳入,
依據傳入的具象類不同,我們所呼叫的 upload(any)
也會有不同的效果。
- 可以看到,在
BackgroundService
的upload(any)
只是單純地將由外面傳入的具象化Uploader
直接呼叫其upload(any)
,本身自己沒有做任何事。 - 自己不做任何事,委託外部的類別來完成,這個動作就叫做委託。
好的,講了那麼多,還是沒有提到 by
的用法啊?
by
下面的 BackgroundService2
同樣也是使用委任的概念,跟前面不同的是使用了 by
關鍵字。
可以發現,用 by
之後,整個程式碼都不用寫了,清爽許多。
我們來測試看看是不是真的有達到替換的效果。
兩種寫法的結果都是一樣的 👍
結論
為什麼要使用委任呢?可以讓類別的使用增加彈性,如上方的範例,我們傳入 Uploader
這個介面,目的是希望 BackgroundService
可以成為一個通用的類別,只要是實作 Uploader
介面的類別都可以傳進來。
利用 Kotlin 所提供的 by
關鍵字,可以讓我們更輕鬆的完成委任的動作。
如果你覺得本篇文章寫的不錯,
請拍手👏鼓勵我~
拍手小秘訣,按著不放可以連續拍喔😊