一文教会你---关于Kotlin 扩展

本文详细介绍了Kotlin的扩展特性,包括扩展函数和属性的使用,以及顶层扩展和类内扩展的区别。类内扩展允许在特定类内部为其他类添加功能,而顶层扩展则在包级别生效。文章还提到了扩展的作用域限制,并提供了一些实战示例来帮助读者更好地理解和应用这些概念。
摘要由CSDN通过智能技术生成

前言

扩展(Extension),可以说是 Kotlin 里最有意思的特性,没有之一。

本文会系统的讲解 Kotlin 扩展函数 和 扩展属性 以及比较难懂的 扩展作用域 和 扩展静态解析 。

前期准备

  • 将 Android Studio 版本升级到最新
  • 将我们的 Demo 工程 clone 到本地,用 Android Studio 打开:https://github.com/chaxiu/KotlinJetpackInAction
  • 切换到分支: chapter_06_extension
  • 强烈建议各位小伙伴小伙伴跟着本文一起实战,实战才是本文的精髓

正文

扩展是什么?

Kotlin 的扩展,用起来就像是: 能给一个类新增功能 这个新增的功能,可以是函数 ,也可以是 属性

借助 Kotlin 扩展,我们能轻易的写出这样的代码:

// 扩展函数
"KotlinJetpackInAction".log()
// 扩展属性
val isBlank = String.isNullOrBlank

以上的代码,看起来就像是我们修改了原本 String 并且往里面加了方法和属性: log() , isNullOrBlank 。

初次见到 扩展 这个特性的时候,我真的被惊艳到了。虽然 扩展 不是 Kotlin 独有的特性(别的现代语言也有),但
是,Kotlin 能在兼容 Java 的同时引入这样的特性,那就真的很了不起了。

顶层扩展 (Top Level Extension)

顶层扩展,是最常用的扩展方式,它的定义方式也很简单,以上面的两行代码为例,我们看看它们分别应该怎么定义吧。

// BaseExt.kt
package com.boycoder.kotlinjetpackinaction
// 注意!!
// 顶层扩展不能定义在任何 Class 里,不然它就变成“类内扩展”了!
// 为 String 定义扩展函数
fun String.log() {
println(this)
}
// 为 String 定义扩展属性
val String?.isNullOrBlank: Boolean
get() = this == null || this.isBlank()

类内扩展 (Declaring extensions as members)

Package级别的顶层扩展理解起来很简单,类内扩展 会稍微复杂些。

类内扩展 (Declaring extensions as members) 在官方中文站的翻译是: 扩展声明为成员 ,这个翻译虽然更接近本质,但太僵硬了,因此我在这里用类内扩展指代它。

类内扩展的写法跟顶层扩展是一模一样的,区别在于它 在其他类的里面 。让我们来看一个例子:

// 被扩展的类
class Host(val hostname: String) {
fun printHostname() { print(hostname) }
}
class Test(val host: Host, val port: Int) {
fun printPort() { print(port) }
// 在 Test 类内给 Host 增加了一个扩展函数

fun Host.printConnectionString() {
printHostname() // Host.printHostname()
print(":")
printPort() // Test.printPort()
}
// 在 Test 类内给 Host 增加了一个扩展属性

val Host.isHomeEmpty: Boolean
get() = hostname.isEmpty()
fun test() {
host.printConnectionString()
}
}
fun main() {
// 报错,Host 的类内扩展,在外面无法访问,这是与顶层扩展的不同
Host("").isHomeEmpty
Host("").printConnectionString()
}

扩展小结:

  • 顶层扩展它不能定义在类内,它的作用域是 Package 级别的,能导包就能用
  • 类内扩展它定义在其他类内,它的作用与局限在该类内
  • 类内扩展的优势在于,它既能访问被扩展类(Host),也能访问它所在的类(Test)
  • 扩展并没有实际修改被扩展的类,因此我们仍然只能访问类里的 public 方法和属性

最后

想要学习Kotlin,多一个大厂面试机会的朋友们,这里有一份《高级Kotlin强化实战》,能更快更好的帮助你从入门到精通Kotlin!扫码100%免费领取~

第一章 Kotlin入门教程

  • Kotlin 概述
  • Kotlin 与 Java 比较
  • 巧用 Android Studio
  • 认识 Kotlin 基本类型
  • 走进 Kotlin 的数组
  • 走进 Kotlin 的集合
  • 集合问题
  • 完整代码
  • 基础语法

在这里插入图片描述

第二章 Kotlin 实战避坑指南

  • 方法入参是常量,不可修改
  • 不要 Companion 、INSTANCE ?
  • Java 重载,在 Kotlin 中怎么巧妙过渡一下?
  • Kotlin 中的判空姿势
  • Kotlin 复写 Java 父类中的方法
  • Kotlin “狠”起来,连TODO 都不放过!
  • is、as` 中的坑
  • Kotlin 中的 Property 的理解
  • also 关键字
  • takeIf 关键字
  • takeIf 关键字
  • 单例模式的写法

在这里插入图片描述

##第三章 项目实战《Kotlin Jetpack 实战》

  • 从一个膜拜大神的 Demo 开始
  • Kotlin 写 Gradle 脚本是一种什么体验?
  • Kotlin 编程的三重境界
  • Kotlin 高阶函数
  • Kotlin 泛型
  • Kotlin 扩展
  • Kotlin 委托
  • 协程“不为人知”的调试技巧
  • 图解协程:suspend

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>