[開發效率]Kotlin之擴展

1、什麼是擴展

Kotlin 能夠對一個類的屬性和方法進行擴展,且不須要繼承或使用 Decorator 模式。 擴展是一種靜態行爲,對被擴展的類代碼自己不會形成任何影響。android

擴展相似是一個設定了使用者的外置裝甲。只要符合使用條件,就能夠使用這種裝甲。git

2、爲何要用擴展

擴展最直接的好處,代碼少,寫得快github

舉個例子,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中判斷時間間隔。但都有一個缺點,代碼太多啦。上吧,烤特林!bash

/**
    *  擴展屬性 延時觸發  即多少時間內重複點擊無反應
    */
    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重複點擊ui

好用的擴展在哪裏

我搜集了一些kotlin經常使用的代碼在裏面,有須要的小夥伴能夠扣一些下來用 github.com/luckyAF/Kom…spa

再舉幾個經常使用的🌰

activity擴展

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

   }
複製代碼

log擴展

data.DEBUG()
複製代碼

數據擴展

data.addTo(arrayList)
複製代碼

總結

總的來講,擴展其實相似於語法糖,挺好用的。假如你們有實用的擴展也能夠交流一下code

相關文章
相關標籤/搜索