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

前言

扩展(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 扩展_第1张图片

第二章 Kotlin 实战避坑指南

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

一文教会你---关于Kotlin 扩展_第2张图片

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

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

一文教会你---关于Kotlin 扩展_第3张图片

你可能感兴趣的:(kotlin,kotlin,android)