【解密 Kotlin 扩展函数】扩展函数的创建(十六)

导读大纲

    • [1.1 为第三方的类添加方法: 扩展函数](#1.1 为第三方的类添加方法: 扩展函数)

1.1 为第三方的类添加方法: 扩展函数

  1. Kotlin 的主题之一与现有代码的平滑集成

    • 即使是纯 Kotlin 项目 ,也是构建在 Java 库之上
      1. 如 JDK、Android 框架和其他第三方框架
    • 而当你将 Kotlin 集成到 Java 项目 中时
      1. 你还要处理尚未或不会转换为 Kotlin 的现有代码
    • 如果能在使用这些 API 时使用 Kotlin 的所有优点
      1. 无需重写它们, 岂不美哉?
  2. 从概念上 讲,扩展函数很简单

    • 扩展函数的本质 是: 一个可以作为类的成员被调用 ,但定义在类之外的函数
    • <1> 为了演示扩展函数,添加一个计算字符串最后一个字符的方法
      1. 暂时忽略处理空字符串的边缘情况
kotlin 复制代码
package strings
fun String.lastChar(): Char = this.get(this.length - 1) // <1>
  1. 只需在添加的函数名称前 加上要扩展的类或接口的名称即可

    • 这个类名被称为接收器类型 ; 而调用扩展函数的值被称为接收器对象
    • 在扩展函数声明中,接收器类型是定义扩展的类型
      1. 可以用它来指定函数要扩展的目标类型
    • 接收器对象是该目标类型的实例 ,可以用它来访问所扩展类型的属性和方法
      1. 这里String就是要扩展的目标类型this就是String类型的实例对象
      2. 简单理解就是:lastChar() 方法是 String 类型的成员
  2. 可以使用与普通类成员相同的语法调用该函数

    • <1> 这里String是接收器类型, "Kotlin"是接收器对象
kotlin 复制代码
fun String.lastChar() = this.get(this.length -1)       // <1>
fun main() { 
    println("Kotlin".lastChar())                       // <1>
}
  1. 从某种意义上 说,你为 String 类添加自己的方法

    • 尽管 String 类并不是您代码的一部分 ,甚至可能没有该类的源代码
      1. 但您仍然可以在项目中用您需要的方法来扩展它
    • 只要编译成 Java 类 , 就可以在该类中添加自己的扩展方法
  2. 在扩展函数的主体 中, 与在成员方法中使用 this 的方式相同

    • <1> 与在Java的普通成员方法 中一样
      1. 访问对象的属性和方法 可以省略"this"关键字
    • <2> 这里可以简化 lastChar() 扩展函数的实现, 省略其中的this
      1. this.get(this.length -1) ==> get(length - 1)
kotlin 复制代码
/* Java */
public class Example {
    private final String name;
    public Example(String name) {
        this.name = name;
    }
    public void sayHello() {
        System.out.println("Hello " + name);              // <1>
    }
}
=======================================================
package strings
fun String.lastChar(): Char = get(length - 1)             // <2>
  1. 在扩展函数(就像在类中定义方法 )中,可以直接访问被扩展类的方法和属性

    • 但是要注意,扩展函数只是扩展功能 ,而不允许你破坏封装
      1. 与类中定义的方法不同 ,扩展函数不能访问私有或受保护的成员
  2. 在扩展函数的主体 中,你可以调用接收器的任何方法(methods)

    1. 这里的方法指的是,既可以调用类中原有的成员函数 ,也可以调用扩展函数
    • 在调用方法时,扩展函数与成员函数是没有区别
      1. 而且通常情况下,特定方法是成员函数还是扩展函数不重要
    • 扩展函数强大之处 就在于可以利用它来扩展源代码中的类
      1. 即使你都没有这个类的源代码
    • <1> 比如在你的代码中调用 lastChar()方法
      1. 根本不需要关注该方法String类自带的还是第三方库扩展
      2. 对于调用者来说,这种调用是无感的
kotlin 复制代码
fun main() { 
    println("Kotlin".lastChar())                       // <1>
}
相关推荐
mjhcsp几秒前
C++区间 DP解析
开发语言·c++
danyang_Q11 分钟前
vscode python-u问题
开发语言·vscode·python
再难也得平14 分钟前
[LeetCode刷题]128.最长连续序列(从零开始的java题解)
java·算法·leetcode
FleetingLore14 分钟前
Kotlin 的5个 scope function 的概念划分的优雅性
kotlin
忘忧记16 分钟前
python QT sqlsite版本 图书管理系统
开发语言·python·qt
亓才孓21 分钟前
【MyBatis Exception】SQLSyntaxErrorException(按批修改不加配置会报错)
java·开发语言·mybatis
亓才孓23 分钟前
【MyBatis Runtime Exception】自动驼峰映射对Map不生效,应该在查询中起别名
java·windows·mybatis
ArturiaZ25 分钟前
【day31】
开发语言·c++·算法
一个响当当的名号27 分钟前
lectrue16 二阶段锁
jvm·数据库
没有bug.的程序员30 分钟前
调试艺术进阶:从断点内核到日志动态化的高效问题定位深度实战指南
java·调试·断点·日志动态化