[開發效率]Kotlin之擴充套件

luckyAF發表於2018-12-07

一、什麼是擴充套件

Kotlin 可以對一個類的屬性和方法進行擴充套件,且不需要繼承或使用 Decorator 模式。 擴充套件是一種靜態行為,對被擴充套件的類程式碼本身不會造成任何影響。

擴充套件類似是一個設定了使用者的外接裝甲。只要符合使用條件,就可以使用這種裝甲。

二、為什麼要用擴充套件

擴充套件最直接的好處,程式碼少,寫得快

舉個例子,view的點選方法

Java最簡潔的方式
   findViewById(R.id.button).setOnClickListener(v -> doSomeThing();      
複製程式碼
Kotlin最簡潔的方式
   button.click{
     doSomeThing()
   }
   
   fun <T : View> T.click(block: (T) -> Unit) = setOnClickListener{
       block(it as T)
       }
   
複製程式碼
附加福利

眾所周知,android開發中, view的重複點選是一個很常見的需要解決的問題。解決方案也很多,rxbindig,重新Listener,listenr中判斷時間間隔。但都有一個缺點,程式碼太多啦。上吧,烤特林!

    /**
    *  擴充套件屬性 延時觸發  即多少時間內重複點選無反應
    */
    private var <T : View> T.triggerDelay: Long
        get() = if (getTag(1123461123) != null) getTag(1123461123) as Long else -1
        set(value) {
            setTag(1123461123, value)
        }
    /**
    *  擴充套件屬性 上次點選事件時間
    */
    private var <T : View> T.triggerLastTime: Long
        get() = if (getTag(1123460103) != null) getTag(1123460103) as Long else 0
        set(value) {
            setTag(1123460103, value)
        }
    
    /**
    * 私有擴充套件方法 計算是否過了延時期
    */
    private fun <T : View> T.delayOver(): Boolean {
        var flag = false
        val currentClickTime = System.currentTimeMillis()
        if (currentClickTime - triggerLastTime >= triggerDelay) {
            triggerLastTime = currentClickTime
            flag = true
        }
        return flag
    }
    fun <T : View> T.clickWithTrigger(time: Long = 600, block: (T) -> Unit) {
        triggerDelay = time
        setOnClickListener {
            if (delayOver()) {
                block(it as T)
            }
        }
    }
    
    // 使用
    button.clickWithTrigger{
        doSomeThing()
    }

複製程式碼

就這樣一行程式碼,解決view重複點選

好用的擴充套件在哪裡

我搜集了一些kotlin常用的程式碼在裡面,有需要的小夥伴可以扣一些下來用 github.com/luckyAF/Kom…

再舉幾個常用的?

activity擴充套件

   jumpTo<TestActivity>()
   jumpToForResult<TestActivity>(null) { resultCode, data ->

   }
複製程式碼

log擴充套件

data.DEBUG()
複製程式碼

資料擴充套件

data.addTo(arrayList)
複製程式碼

總結

總的來說,擴充套件其實類似於語法糖,挺好用的。假如大家有實用的擴充套件也可以交流一下

相關文章