朱涛 · Kotlin 编程第一课
朱涛
Google 认证的 Kotlin、Android 开发者专家,博客“Kotlin Jetpack 实战”作者
6717 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
朱涛 · Kotlin 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

06 | 扩展:你的能力边界到底在哪里?

你好,我是朱涛。
Kotlin 的扩展(Extension),主要分为两种语法:第一个是扩展函数,第二个是扩展属性。从语法上看,扩展看起来就像是我们从类的外部为它扩展了新的成员。
这在实际编程当中是非常有用的功能。我们可以来想象一个场景:我们想修改 JDK 当中的 String,想在它的基础上增加一个方法“lastElement()”来获取末尾元素,如果使用 Java,我们是无法通过常规手段实现的,因为我们没办法修改 JDK 的源代码。任何第三方提供的 SDK,我们都无权修改。
不过,借助 Kotlin 的扩展函数,我们就完全可以在语义层面,来为第三方 SDK 的类扩展新的成员方法和成员属性。不管是为 JDK 的 String 增加新的成员方法,还是为 Android SDK 的 View 增加新成员属性,我们都可以实现。
Kotlin 的这个“扩展”功能看起来很神奇,它会不会很难学?其实不然,它的语法非常简洁。今天这节课,我们就一起来学习下 Kotlin 当中的扩展。通过研究它的原理,来探索它的能力边界,并在理解和掌握核心知识点之后,去思考它的实战应用场景。

什么是扩展函数和扩展属性?

扩展函数,就是从类的外部扩展出来的一个函数,这个函数看起来就像是类的成员函数一样。这里,我们就以 JDK 当中的 String 为例,来看看如何通过 Kotlin 的扩展特性,为它新增一个 lastElement() 方法。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kotlin的扩展功能为开发者提供了在类的外部扩展新成员方法和属性的能力,极大地增强了代码的灵活性和可扩展性。扩展函数和扩展属性的语法和实现原理得到了深入探讨,包括其作用域、本质、能力边界和实际应用场景。Kotlin的扩展能够取代Java的工具类,提供智能提示,但无法被子类重写;扩展属性无法存储状态,访问作用域仅限于定义处的成员和接收者类型的公开成员。在实际应用中,Kotlin的扩展在Kotlin标准库和Android开发中有广泛应用,能够实现关注点分离设计和提升代码可读性与开发效率。总的来说,本文通过简洁清晰的语言和丰富的示例,帮助读者快速了解Kotlin的扩展功能,为其实战应用提供了技术支持。文章还提出了思考题,引发读者对可为空类型的扩展进行思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱涛 · Kotlin 编程第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • 神秘嘉Bin
    更新完之后可能已经被开除了,每天都更新多好

    作者回复: 哈哈,挺住啊

    2022-01-07
    17
  • Paul Shan
    扩展本质是静态函数+固定第一个参数,nullable的扩展,就是第一个参数为nullable,这和一个参数是否为空的作用类似,一方面可以接受更广的参数类型,另外一方面在扩展函数内部需要处理为空的情况。这样做是否合适就取决于应用场景了,多数情况还是不要为空为好,代码更简洁,但是在处理网络调用和兼容java的代码等特殊情况下,有的时候不得不处理为空的情况,那就扩展nullable类型。

    作者回复: 很好的答案!推荐大家看看。

    2022-03-15
    8
  • xiaomengjie
    1、调用 fun String.lastElement(): Char? {}:只能是不可null的String才能调用 fun String?.lastElement(): Char? {}:可null String和不可null String都能调用 2、实现 fun String.lastElement(): Char? {}:返回值为null,只有length == 0 fun String?.lastElement(): Char? {}:返回值为null,this == null 或者 length == 0

    作者回复: 赞~分析的不错。

    2022-01-07
    6
  • 魏全运
    接受者可空的扩展在遇到空对象调用时不会抛异常,并且允许可空对象调用。

    作者回复: 不错~

    2022-01-09
    5
  • 郑峰
    Note that extensions can be defined with a nullable receiver type. These extensions can be called on an object variable even if its value is null, and they can check for this == null inside the body. This way, you can call lastElement() in Kotlin without checking for null, as the check happens inside the extension function.

    作者回复: 不错~

    2022-01-18
    3
  • 〆WingChing℡ご
    和 Swift语法相比,感觉上kotlin不是很好理解,语法有点怪异,是不是kt基于jvm要适配java的原因啊

    作者回复: Kotlin跟Swift已经非常接近了。哪个好哪个坏,其实更多的是先入为主,看惯了Swift可能会觉得Kotlin有点怪,反之亦然。Kotlin的语法设计,跟它适配JVM其实没太大关系的。

    2022-04-29
    1
  • 叶稳健
    区别就是接收参数是否可以为空,有 ?参数可空,可处理的范围更广

    作者回复: 没错~

    2022-04-25
    1
  • Emmm
    hello,大佬,可以给一下枚举类的扩展吗

    作者回复: 枚举类是可以扩展的,但并不一定有广泛的应用场景。 enum class Human { MAN, WOMAN } val Human.count: Int get() = Human.values().size

    2022-01-07
    3
    1
  • 追梦
    写的太好了,急不可待的想看下面的内容,催更,催更~~

    作者回复: 感谢你的鼓励,我们一起加油~

    2022-01-07
    1
  • neo
    不为空的接收者类型 = 调用的String不可为null 可为空的接收者类型 = 调用的String可为null

    作者回复: 是的,那么它们各自的使用场景呢?

    2022-03-22
收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部