当前位置:首页 > 科技  > 软件

Kotlin的扩展(Extension)特性,你了解了吗?

来源: 责编: 时间:2024-03-20 08:49:59 218观看
导读Kotlin扩展(Extension)特性允许为现有的类添加新的函数和属性,而无需继承该类或使用装饰器模式。可以在不修改原始类的情况下,为它添加新的行为。在实际编程当中是非常有用的功能,具体场景如:我们想修改JDK中的String,想在它

Kotlin扩展(Extension)特性允许为现有的类添加新的函数和属性,而无需继承该类或使用装饰器模式。可以在不修改原始类的情况下,为它添加新的行为。0Cs28资讯网——每日最新资讯28at.com

在实际编程当中是非常有用的功能,具体场景如:我们想修改JDK中的String,想在它的基础上增加一个方法"lastElement() "来获取末尾元素,如果使用Java,我们是无法通过常规手段实现的,因为我们无法修改JDK的源码。0Cs28资讯网——每日最新资讯28at.com

扩展函数

fun ClassName.functionName(parameters) {    // 函数体}

ClassName是要添加函数的类名,functionName是新函数的名称,parameters是函数的参数列表,函数体是函数的实际实现。0Cs28资讯网——每日最新资讯28at.com

例如,我们可以向String类添加一个名为lastElement的扩展函数,用于来获取末尾元素:0Cs28资讯网——每日最新资讯28at.com

fun String.lastElement(): Char? {    if (this.isEmpty()) {        return null    }    return this[length - 1]}// 使用扩展函数fun main() {    val msg = "Hello Wolrd"    // lastElement就像String的成员方法一样可以直接调用    val last = msg.lastElement() // last = d}

lastElement函数就会在所有String对象上可用,而不需要修改String类的源代码。0Cs28资讯网——每日最新资讯28at.com

扩展函数实现原理,反编译示例代码:0Cs28资讯网——每日最新资讯28at.com

public final class ExtKt {   public static final Character lastElement(String $this) {      CharSequence var1 = (CharSequence)$this;      if (var1.length() == 0) {        return null      }      return  var1.charAt(var1.length() - 1);   }}public static final void main() {  String msg = "Hello Wolrd";  Character last = ExtKt.lastElement(msg);}

原本定义在String类型上面的扩展函数lastElement(),变成了一个普通的静态方法。另外,之前定义的扩展函数lastElement()是没有参数的,但反编译后的Java代码中,lastElement(String $this)多了一个String类型的参数。原本msg.lastElement()的地方变成了ExtKt.lastElement(msg),这说明,Kotlin编写的扩展函数调用代码,最终会变成静态方法的调用。0Cs28资讯网——每日最新资讯28at.com

扩展属性

Kotlin中的扩展属性允许我们向现有的类添加新的属性,而无需继承该类或使用装饰者模式。扩展属性的语法与扩展函数类似,但是在属性名之前需要指定接收者类型。0Cs28资讯网——每日最新资讯28at.com

还是以lastElement为例,以扩展属性的方式实现:0Cs28资讯网——每日最新资讯28at.com

// 接收者类型val String.lastElement: Char?    get() = if (isEmpty()) {            null        } else {            get(length - 1)        }fun main() {    val msg = "Hello Wolrd"    // lastElement就像String的成员属性一样可以直接调用    val last = msg.lastElement // last = d}

需要注意的是,扩展属性并不会真正地向类中添加新的属性,它只是提供了一种便捷的方式来访问现有类的属性或计算新的属性值。不管是扩展函数还是扩展属性,它本质上都会变成一个静态的方法。0Cs28资讯网——每日最新资讯28at.com

应用场景

Kotlin的扩展特性允许开发者向现有的类添加新的方法和属性,而无需继承该类或使用装饰者模式。0Cs28资讯网——每日最新资讯28at.com

  1. 扩展第三方库:可以使用扩展函数为第三方库中的类添加额外的功能,而无需修改原始类的源代码。
  2. 使代码更具可读性:可以通过为常用的类添加自定义方法,使代码更易读、更易维护。
  3. 适配特定平台:可以使用扩展函数为特定平台(如Android或iOS)上的类添加平台特定的功能,而无需在通用代码中添加平台相关的逻辑。
  4. 减少重复代码:可以通过扩展函数将一些重复的操作封装成新的方法,从而减少代码重复性。

当然,扩展特性有一些使用限制:0Cs28资讯网——每日最新资讯28at.com

  1. 扩展函数不能访问私有或受保护的成员:扩展函数可以在类的外部定义,但不能访问类的私有或受保护成员。
  2. 扩展函数不能被重写:由于扩展函数是静态解析的,因此不能被子类重写。
  3. 不能在扩展函数中添加新的属性:扩展函数可以为现有类添加新的函数,但不能添加新的属性。
  4. 不能在扩展函数中访问super关键字:扩展函数中无法使用super关键字来调用基类的函数。
  5. 作用域限制:扩展函数的作用域是在导入它的包内,因此在其他包中无法直接使用。

Kotlin的扩展特性使用限制主要是为了保证代码的可靠性和可维护性。0Cs28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-77980-0.htmlKotlin的扩展(Extension)特性,你了解了吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: NEC 连续 13 年入选 Clarivate 全球创新者 100 强

下一篇: 20行代码,封装一个 React 图片懒加载组件

标签:
  • 热门焦点
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 线程通讯的三种方法!通俗易懂

    线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • CSS单标签实现转转logo

    CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 服务存储设计模式:Cache-Aside模式

    服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 慕岩炮轰抖音,百合网今何在?

    慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz“难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?”这一番话,出自百合网联合创
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
  • 电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会为了更好地让参展观众真正感受到智能家居的绝妙之处,海尔智家的程传岭先生同样介绍了展会上海尔智家的模拟500平大平层,还原生活空间沉浸式体验。程传
  • 电博会与软博会实现

    电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
Top
Baidu
map