Kotlin扩展函数

摘自官网解释:

Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式

扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响

扩展函数

fun receiverType.functionName(params){
    body
}
fun Float.toPx(): Float {
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        this,
        Resources.getSystem().displayMetrics
    )
}

注:创建这样一个kt文件,按照以上这个方式写出来的方法,是属于receiverType这个类吗?不是的,它不属于任何一个类,是一个顶层函数Top-level Function,属于所在的包。为什么能够被receiverType的对象调用呢?实际是限定了扩展函数只有通过receiverType类型才能调用。

成员扩展函数

class Exp {
    fun String.method() {
        println("---->>>")
    }

    fun startTest() {
        "test".method()
    }
}

注:这种成员的扩展函数,调用范围只能在这个类的内部,外部不能调用

扩展属性

val Float.dp
    get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics)

注:扩展属性只能被声明为 val,不允许被初始化,只能由显式提供的 getter/setter 定义。

扩展函数是静态解析

在kotlin中扩展是静态分发的,不是根据接收者类型的虚方法。也就是说调用扩展函数是由调用所在的表达式类型来决定的,而不是由表达式运行时求值结果决定的。例如:

open class C

class D: C()

fun C.name() = "cName"   // 扩展函数 foo

fun D.name() = "dName"   // 扩展函数 foo

fun printFoo(c: C) {
    println(c.name())  // 类型是 C 类
}

fun main(arg:Array<String>){
    printFoo(D())
}
### Kotlin 扩展函数的定义 扩展函数允许为已有的类添加新功能,而无需继承该类或使用设计模式。通过这种方式可以保持代码简洁并提高可读性[^3]。 ### 创建和调用扩展函数 为了创建一个针对特定类型的扩展函数,在函数名前指定接收者类型即可: ```kotlin fun MutableList<Int>.swap(index1: Int, index2: Int) { val tmp = this[index1] this[index1] = this[index2] this[index2] = tmp } ``` 上述例子展示了如何向 `MutableList` 类型增加名为 `swap` 的方法。现在可以在任何整数列表上调用此方法来交换两个位置上的元素。 当需要访问被扩展对象内部成员时可以直接使用 `this` 关键字;如果不需要显式提及,则可以根据上下文自动推断出来。 对于静态解析机制而言,编译器会在编译期决定哪个具体实现应该被执行——即使存在多个同名但不同参数签名的方法也不会引起混淆。 ### 使用场景实例:简化锁操作 考虑下面这个利用互斥量(`Mutex`)的例子: ```kotlin class Counter(private val mutex: Mutex = Mutex()) { private var count = 0 fun increment(): Unit = mutex.withLock { count++ } } ``` 这里定义了一个计数器类,并为其提供了一种线程安全的方式来进行自增运算。借助于 `withLock()` 这样的内置高阶函数,不仅减少了样板代码的数量,还使得逻辑更加直观易懂。 ### 处理可能为空的对象 另一个常见的应用场景是在处理潜在 null 值的情况下优雅地执行某些动作。比如想要把苹果加入篮子之前先确认它不是 null : ```kotlin val fruitBasket = mutableListOf<String>() appleTree.pick()?.let { fruitBasket.add(it) } ``` 这段代码片段说明了怎样运用 `?.` 和 `let` 来确保只有当获取到有效果实的时候才会尝试将其放入集合中去[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ezview_uniview

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值