Kotlin扩展函数本质到底是什么?
先说点题外话。
不知道各位朋友,你们的项目中,有没有用kotlin,但是安卓领域,新项目,几乎都是用kotlin写了。
也许后端spring那一套,估计有很多老项目还是java,个人一点粗浅的看法,kotlin用过之后,是真香。
我写文章不喜欢一堆的名词,也不喜欢啰嗦。下面直接开始。
1. 什么是扩展函数?
比如在计算大数值的时候,经过要把字符串数据转成 BigDecimal , 再作运算
如下:调用 toBD()
扩展函数,把字符串转成 BigDecimal 对象
var s = "123.02"
var bd = s.toBD() //调用 toBD() 扩展函数
上面的 toBD()
就是扩展函数,而且是 String 的扩展函数
有人可能会问了,这种很简单啊,直接用 var bd = BigDecimal (s)
, 就直接可以把字符串转成了 BigDecimal 对象
为啥还要用扩展函数呢?
首先这只是个例子,但就算是这个例子,如果 s = "helloworld.net" 呢,后端返回的值不一定是数字字符串。
直接
var bd = BigDecimal (s)
会崩溃的。那么用 toBD() 就不会崩溃了吗?
toBD() 里面就可以写很多代码了,可以处理这种异常情况 。
2. 扩展函数怎么定义?
上面的 toBD()
用着简单,怎么定义呢?
在项目里面新建一个文件,比如叫 StringExt.kt
在此文件中,添加如下代码
fun String.toBD():BigDecimal? { var bd :BigDecimal? = null try { // 这个this 就是上面的 "123.02" //再比如,"100".toDB(), this 就是 "100" bd = BigDecimal(this) }catch (e:Exception) { } return bd }
解释:
fun String.toBD():BigDecimal?
在 String 类上添加一个
toBD()
的扩展方法,函数返回值是BigDecimal?
这是规定,规定就是这样写的。
在哪个类上添加扩展方法,就
XX.method()
比如想在 Int 类上添加一个方法, 就
fun Int.xx()
总结:定义就是这么简单,不要想复杂了。记住就行了。
3. 扩展函数的本质到底是什么呢?
对于 fun String.toBD():BigDecimal?
这个扩展方法
解释:其实kotin 并没有真正的在String类里面添加一个toBD()
的方法
扩展函数只是一个kotlin的语法糖,用着方便而已。
3.1 如果不用扩展函数,怎么实现上面的需求?
很多人应该能想到,就是写一个工具类,写一个静态函数。
public class StringUtil {
public static BigDecimal toBD(String s){
BigDecimal bd = null;
try {
bd = new BigDecimal(s);
}catch (Exception e) {
}
return bd;
}
}
使用的时候:
BigDecimal bd = StringUtil.toBD("123.02")
总结: 写到这,应该明白了,kotlin扩展函数的本质 ,就是编译器在背后生成了静态函数
当然类名就不叫 StringUtil
了,至于叫什么,本文不讨论,不增加多余信息,再说你管它叫什么呢,爱啥叫啥
3.2 再重复一遍 : kotlin扩展函数的本质,就是静态函数
4. 扩展函数有什么用
代替Java中,那一坨坨的 xxUtils 工具类用的。
通过上面的学习,应该能明白了扩展函数是啥了
如果本文对你有一点帮忙,那我还是有一点点成就感的,很开心。
如文章有问题,请指正,我改