相关文章推荐
绅士的毛衣  ·  基于JavaScript ...·  1 月前    · 
朝气蓬勃的针织衫  ·  【聽歌學英文】愛樂團的你不可不知!關於樂團的 ...·  4 月前    · 
无邪的扁豆  ·  天諭手遊冒險任務鏡頭語言- ...·  5 月前    · 
豪气的电影票  ·  《老友记》,一代人的都市童话·  5 月前    · 
豪爽的萝卜  ·  奥丁_百度百科·  1 年前    · 
强健的四季豆  ·  活塞式航空发动机_百度百科·  2 年前    · 
Code  ›  9. Kotlin 函数声明和扩展(extension)开发者社区
社区功能 kotlin 函数声明
https://cloud.tencent.com/developer/article/1606843
细心的豆腐
1 年前
sickworm

9. Kotlin 函数声明和扩展(extension)

腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
sickworm
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 9. Kotlin 函数声明和扩展(extension)

9. Kotlin 函数声明和扩展(extension)

作者头像
sickworm
发布 于 2020-03-30 17:18:37
879 0
发布 于 2020-03-30 17:18:37
举报
文章被收录于专栏: sickworm sickworm

1. Java 的老朋友 Utils 工具类

Utils 工具类是无构造参数的 static 方法集合,用于扩展某个对象的功能,如 MathUtils,ToastUtils,FIleUtils,StringUtils, LogUtils。Utils 类在一定程度上减少了重复代码的问题,它是成本最低的 DRY(Don’t repeat yourself)实践。

Utils 工具类实在太常见了,以至于很多开发者都不曾质疑他的合理性。但 Utils 实际上是反 OOP (面向对象模式)的妥协产物。我们从代码设计的角度看,Utils 方法是 static 的,没有 OOP 的继承,重写,抽象的特性(static 本身就是反 OOP 的)。且 Utils 违反了单一职责,一个类应该包含其属性和所有操作方法。而 Utils 实现的方法并不在这个类内。

而从使用者的角度, 使用者必须预先知道这个 Utils 工具类的存在,他能使用为这个类添加的扩展方法。 在实际项目实践中,这个条件往往是缺失的,因为在团队开发中,个人无法掌握所有代码,因为不知道这个代码已经有人实现过了,导致大家都实现了自己的 Utils。一个工程里同一个类的 Utils 往往会有好几个。

但存在必然是合理的。我自己就是一个写 Utils 的老司机。从个人角度来看,让我使用 Utils 而不是对象继承的原因,主要是因为:

1. 无法继承/重写这些类及其方法,只能通过 Utils 扩展;
2. 继承一个类比抽取代码块封装为函数的实现成本+替换成本高;
3. Utils 绝大情况下只是用来存储代码块,需求非常稳定,无需面向对象。

依赖的类是 SDK 提供的时候 Utils 往往是不可避免的。且使用 Utils 的场景里很少会用到面向对象的特性,那么没有面向对象的缺点也并没有那么严重了。那么抛开 Utils 的设计缺点,我们是否可以避免使用上的缺点?Kotlin 提供的解决方法就是扩展(extension)。

2. Kotlin 扩展的使用和实现分析

声明一个 Kotlin 扩展如下:

// StringUtils.kt
fun String.appendHaha(): String {
    return this + "haha"
}

它与普通的方法声明很接近,只是方法名前多了一个类名,来表示其归属的类。扩展声明为顶层声明的时候可以被外部调用(是的,因为函数是一等公民,在方法内部也可以声明扩展方法)。

在函数体内用 this 来引用调用的实例,属性和方法的访问权限与普通调用一致。一致的意思是和你正常在其他方法内部调用的权限一致,并不会因为是扩展声明就可以访问 private/propect 权限的属性和方法。这是因为扩展声明在字节码层面上其实是 static 方法。下面是 appendHaha 对应 jvm 字节码的反编译结果:

public class StringUtilsKt {
 
推荐文章
绅士的毛衣  ·  基于JavaScript 声明全局变量的三种方式详解 - 听风。
1 月前
朝气蓬勃的针织衫  ·  【聽歌學英文】愛樂團的你不可不知!關於樂團的二三事! | Engoo ...
4 月前
无邪的扁豆  ·  天諭手遊冒險任務鏡頭語言- jellieshsu的創作- 巴哈姆特
5 月前
豪气的电影票  ·  《老友记》,一代人的都市童话
5 月前
豪爽的萝卜  ·  奥丁_百度百科
1 年前
强健的四季豆  ·  活塞式航空发动机_百度百科
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号