Kotlin中实现接口回调的研究(一)


之前看到一句很著名的话“不要重复自己”,这也告诉了我们不要重复的造轮子,在Java中,我们可以通过接口回调来大幅简化我们的代码,并提升我们的代码可读性,而在kotlin里代码回调则要更具有一些kotlin“风味”,这里我们可以来写一个简单的例子

val mBtn=findViewByID(R.id.button)
mBtn.setOnClickListener{
    //do something
}

当这里只有一个按钮的时候,只需要这么设置即可,但是当存在多个按钮的时候

        val mbtn1=findViewById<Button>(R.id.btn_1)
            // do something
        }
        val mbtn2=findViewById<Button>(R.id.btn_2)
               // do something
        }
        val mbtn3=findViewById<Button>(R.id.btn_3)
               // do something
        }
        val mbtn4=findViewById<Button>(R.id.btn_4)
              // do something
        }
        val mbtn5=findViewById<Button>(R.id.btn_5)
               // do something
        }
        val mbtn6=findViewById<Button>(R.id.btn_6)
            // do something
        }

这样写就太过于愚蠢了,首先我们如果旨在onCreate()方法里声明button,结果就是在这个函数外都无法使用,其次这样的代码可读性和维护性都非常低,是典型的面向过程,那如果我们定义一个函数来实现onclick呢?

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val mbtn1=findViewById<Button>(R.id.btn_1)
        val mbtn2=findViewById<Button>(R.id.btn_2)
    }
    fun foo(){
        //无法这么做,此时AS报错找不到mbtn*
        mbtn1.setOnClickListener{
            // do something
        }
    }

所以这里是我们要做的第一个改变,即首先要声明我们的变量

class MainActivity : AppCompatActivity() {
    lateinit var mBtn1:Button
    lateinit var mBtn2:Button
    ……
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mbtn1=findViewById<Button>(R.id.btn_1)
        mbtn2=findViewById<Button>(R.id.btn_2)
        ……
        foo()
    }
    fun foo(){
        mbtn1.setOnClickListener{
            // do something
        }
        ……
    }

但是就算这么写,也仅仅是做了个初级封装,这时就要用到kotlin的接口回调了

img

这样,代码就可以重构成

class MainActivity : AppCompatActivity() {
    lateinit var mBtn1:Button
    lateinit var mBtn2:Button
    ……
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mbtn1=findViewById<Button>(R.id.btn_1)
        mbtn2=findViewById<Button>(R.id.btn_2)
        ……
        setListener()
    }
    private fun setListener(){
        var onclick:OnClick
        mbtn1.setOnClickListener(onclick)
        mbtn2.setOnClickListener(onclick)
        ……
    }
    class OnClick: View.OnClickListener{
        override fun onClick(v: View?) {
            when(v!!.id){
                R.id.btn_1->
                // do something
                R.id.btn_2->
                // do something
                ……
                else ->
                // do something
            }
        }
    }

这样,我们就实现了一个比较高级的封装,它可以大大提高我们代码的可维护性,这里第一期只是说了kotlin接口回调的一个小应用(毕竟我也在不断学习),但无论如何,发挥面向对象的优势是我们写出好代码的重中之重


文章作者: Leon
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Leon !
 上一篇
在手机上访问discord和pixiv的正确姿势 在手机上访问discord和pixiv的正确姿势
这几天,我的开源项目的总star终于达到两位数了,感谢协会和DMR的朋友们! ============================================================================== st
2020-04-08 Leon
本篇 
Kotlin中实现接口回调的研究(一) Kotlin中实现接口回调的研究(一)
之前看到一句很著名的话“不要重复自己”,这也告诉了我们不要重复的造轮子,在Java中,我们可以通过接口回调来大幅简化我们的代码,并提升我们的代码可读性,而在kotlin里代码回调则要更具有一些kotlin“风味”,这里我们可以来写一个简单的
2020-03-14 Leon
  目录