[开发效率]Kotlin之扩展

1,491 阅读2分钟

一、什么是扩展

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)

总结

总的来说,扩展其实类似于语法糖,挺好用的。假如大家有实用的扩展也可以交流一下