QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

Android 开发者应该知道的 Kotlin

  • 2016-01-08
  • 本文字数:3336 字

    阅读完需:约 11 分钟

Android 开发者在语言限制方面面临着一个困境。众所周知,目前的 Android 开发只支持 Java 6(语言本身从 Java 7 开始进行了一些改进),因此我们每天只能使用一种古老的语言来进行开发,这极大地降低了我们的生产力,同时也迫使我们不得不编写大量的样板与脆弱的代码,然而这样的代码是难以阅读和维护的。幸运的是,Android 程序是运行在 Java 虚拟机之上的,因此从技术上来说,可以运行在 JVM 之上的一切都可用于开发 Android 应用。现在已经有很多可以生成 JVM 能够执行的字节码的语言,其中一些语言开始崭露头角并逐步流行起来,Kotlin 就是其中的佼佼者。

何为 Kotlin?

Kotlin 是一门运行在 JVM 之上的语言。它由 Jetbrains 创建,而 Jetbrains 则是诸多强大的工具(如知名的 Java IDE IntelliJ IDEA)背后的公司。Kotlin 是一门非常简单的语言,其主要目标之一就是提供强大语言的同时又保持简单且精简的语法。其主要特性如下所示:

  • 轻量级:这一点对于 Android 来说非常重要。项目所需要的库应该尽可能的小。Android 对于方法数量有严格的限制,Kotlin 只额外增加了大约 6000 个方法。
  • 互操作:Kotlin 可与 Java 语言无缝通信。这意味着我们可以在 Kotlin 代码中使用任何已有的 Java 库;因此,即便这门语言还很年轻,但却已经可以使用成百上千的库了。除此之外,Kotlin 代码还可以为 Java 代码所用,这意味着我们可以使用这两种语言来构建软件。你可以使用 Kotlin 开发新特性,同时使用 Java 实现代码基的其他部分。
  • 强类型:我们很少需要在代码中指定类型,因为编译器可以在绝大多数情况下推断出变量或是函数返回值的类型。这样就能获得两个好处:简洁与安全。
  • Null 安全:Java 最大的一个问题就是 null。如果没有对变量或是参数进行 null 判断,那么程序当中就有可能抛出大量的 NullPointerException,然而在编码时这些又是难以检测到的。Kotlin 使用了显式的 null,这会强制我们在必要时进行 null 检查。

目前 Kotlin 的版本是 1.0.0 Beta 3,不过正式版很快就会发布。它完全可以用在生产当中,现在就已经有很多公司成功应用上了 Kotlin。

为何说 Kotlin 非常适合于 Android?

基本上,这是因为 Kotlin 的所有特性都非常适合于 Android 生态圈。Kotlin 的库非常小,我们在开发过程中不会引入额外的成本。其大小相当于 support-v4 库,我们在很多项目中所使用的库都比 Kotlin 大。除此之外,Android Studio(官方的 Android IDE)是基于 IntelliJ 构建的。这意味着我们的 IDE 对该语言提供了非常棒的支持。我们可以很快就配置好项目,并且使用熟悉的 IDE 进行开发。我们可以继续使用 Gradle 以及 IDE 所提供的各种运行与调试特性。这与使用 Java 开发应用别无二致。归功于互操作性,我们可以在 Kotlin 代码中使用 Android SDK 而不会遇到任何问题。实际上,部分 SDK 使用起来会变得更加简单,这是因为互操作性是非常智能的,比如说它可以将 getters 与 setters 映射到 Kotlin 属性上,我们也可以以闭包的形式编写监听器。

如何在 Android 开发中使用 Kotlin?

过程非常简单,只需按照下面的步骤来即可:

  • 从 IDE plugins 中下载 Kotlin 插件
  • 在模块中创建 Kotlin 类
  • 使用“Configure Kotlin in Project…”
  • 开始编码

Kotlin 的一些特性

Kotlin 拥有大量非常打动人心的特性,这里无法一一进行介绍,不过我们来看一下其中最为重要的一些。

Null 安全

如前所述,Kotlin 是 null 安全的。如果一个类型可能为 null,那么我们就需要在类型后面加上一个?。这样,每次在使用该类型的变量时,我们都需要进行 null 检查。比如说,如下代码将无法编译通过:

复制代码
var artist: Artist? = null?
artist.print()

第 2 行会显示一个错误,因为没有对变量进行 null 检查。我们可以这样做:

复制代码
if (artist != null) {
? artist.print()?
}

这展示了 Kotlin 另一个出色的特性:智能类型转换。如果检查了变量的类型,那就无需在检查作用域中对其进行类型转换。这样,我们现在就可以在 if 中将 artist 作为 Artist 类型的变量了。这对于其他检查也是适用的。还有一种更简单的方式来检查 null,即在调用对象的函数前使用?。甚至还可以通过 Elvis 运算符? 提供另外一种做法:

复制代码
val name = artist?.name ?: ""

数据类

在 Java 中,如果想要创建数据类或是 POJO 类(只保存了一些状态的类),我们需要创建一个拥有大量字段、getters 与 setters 的类,也许还要提供 toString 与 equals 方法:

复制代码
public class Artist {
private long id;
private String name;
private String url;
private String mbid;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMbid() {
return mbid;
}
public void setMbid(String mbid) {
this.mbid = mbid;
}
@Override public String toString() {
return "Artist{" +
"id=" + id +
", name='" + name + '\'' +
", url='" + url + '\'' +
", mbid='" + mbid + '\'' +
'}';
}
}

在 Kotlin 中,上述代码可以写成下面这样:

复制代码
data class Artist (?
var id: Long,
var name: String,
var url: String,
var mbid: String)

Kotlin 使用属性而非字段。基本上,属性就是字段加上其 getter 与 setter。

互操作

Kotlin 提供了一些非常棒的互操作特性,这对于 Android 开发帮助非常大。其中之一就是拥有单个方法的接口与 lambda 表达式之间的映射。这样,下面这个单击监听器:

复制代码
view.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View) {
toast("Click")?
}
?})

可以写成这样:

复制代码
view.setOnClickListener { toast("Click") }

此外,getters 与 setters 都会自动映射到属性上。这并不会造成性能上的损失,因为字节码实际上只是调用原来的 getters 与 setters。如下代码所示:

复制代码
supportActionBar.title = title
textView.text = title
contactsList.adapter = ContactsAdapter()

Lambda 表达式

Lambda 表达式会在极大程度上精简代码,不过重要的是借助于 Lambda 表达式,我们可以做到之前无法实现或是实现起来非常麻烦的事情。借助于 Lambda 表达式,我们可以以一种更加函数式的方式来思考问题。Lambda 表达式其实就是一种指定类型,并且该类型定义了一个函数的方式。比如说,我们可以像下面这样定义一个变量:

复制代码
val listener: (View) -> Boolean

该变量可以声明一个函数,它接收一个 view 并返回这个函数。我们需要通过闭包的方式来定义函数的行为:

复制代码
val listener = { view: View -> view is TextView }

上面这个函数会接收一个 View,如果该 view 是 TextView 的实例,那么它就会返回 true。由于编译器可以推断出类型,因此我们无需指定。还可以更加明确一些:

复制代码
val listener: (View) -> Boolean = { view -> view is TextView }

借助于 Lambda 表达式,我们可以抛弃回调接口的使用。只需设置希望后面会被调用的函数即可:

复制代码
fun asyncOperation(value: Int, callback: (Boolean) -> Unit) {
...
callback(true)?
}
asyncOperation(5) { result -> println("result: $result") }

还有一种更加简洁的方式,如果函数只接收一个参数,那就可以使用保留字 it:

复制代码
asyncOperation(5) { println("result: $it") }

Anko

Anko 是 Kotlin 团队开发的一个库,旨在简化 Android 开发。其主要目标在于提供一个 DSL,使用 Kotlin 代码来声明视图:

复制代码
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
{1}

它还提供了其他一些很有用的特性。比如说,导航到其他 Activity:

复制代码
startActivity<detailactivity>("id" to res.id, "name" to res.name)
</detailactivity>

总结

如你所见,Kotlin 在很多方面都简化了 Android 的开发工作。它会提升你的生产力,并且可以通过非常不同且更加简单的方式来解决一些常见的问题。

2016-01-08 01:227383
用户头像

发布了 88 篇内容, 共 264.2 次阅读, 收获喜欢 8 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

4大要点助你选择室内LED显示屏

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家 户内led显示屏

探索顶级PDF水印API:PDFBlocks(2024年更新)

幂简集成

API PDF水印

行云堡垒V7.4新特性

行云管家

FCPX插件:MotionVFX - mWedding 2 盛大的婚礼效果

Rose

郑雁鹏|浅谈工业实时数据库和时序数据库的关系

麦杰研究院

数据库 工业实时数据库 工业时序数据库 麦杰科技 麦杰研究院

华为云联创营CIO领航班第一期:数字化转型与AI赋能的深度探索

科技热闻

使用代理IP有风险吗?

IPIDEA全球HTTP

代理IP

家庭责任增加的挑战:开发的体育直播平台如何维持年轻用户?

软件开发-梦幻运营部

玩转京东商品评论数据接口:数据挖掘与洞察

tbapi

京东商品评论内容接口 京东API 京东商品评论数据接口

Adobe Camera Raw增效工具 for mac v16.2.0中文激活版

Rose

Adobe Camera Raw下载 Adobe Camera Raw中文 Adobe Camera Raw破解

Optical Flares插件怎么安装?Optical Flares中文汉化版详细安装教程

Rose

中文版Nik Collection 6 滤镜插件套装 适用于ps/lr

Rose

Nik Collection 6 滤镜

鲁棒性目标检测 TOP2 方案分享

阿里云天池

【YashanDB知识库】共享集群YAC换IP

YashanDB

yashandb 崖山数据库 崖山DB

中文汉化版 眼睛糖果滤镜PS插件 Alien Skin Eye Candy 7下载安装

Rose

ps滤镜下载 Alien Skin Eye Candy 7 眼睛糖果滤镜

Tomcat源码分析 (一)----- 手撕Java Web服务器需要准备哪些工作

派大星

tomcat源码解读

Coze插件发布!PDF转Markdown功能便捷集成,打造你的专属智能体

合合技术团队

人工智能 PDF

和鲸携手山东大学数字人文实验室,推动新文科与人工智能融合发展

ModelWhale

3款让工作效率翻倍的神器!一键轻松搞定PDF转PPT!

职场工具箱

效率工具 职场 PPT 办公软件 AI生成PPT

和鲸科技受邀出席辽宁省计算机基础教育学会 2024 年学术年会

ModelWhale

专业音调校正和操控 Nuro Audio Xpitch for mac v1.0.2激活版

Rose

photoshop阴影插件 Shadowify 苹果Mac版

Rose

ps阴影插件 Shadowify

D2O 前置放大器仿真插件(Triton Audio D2O mac版下载安装)

Rose

行云堡垒-幽影护企业数据安全!

行云管家

数字化 数据安全 企业数据

云解析的智能线路是什么意思?有什么实际用途?

国科云

AE关键帧缓入缓出曲线调节脚本 AEscripts flow mac版 支持M1/M2

Rose

AE关键帧

一汽集团数据专家分享:实时数据技术在汽车行业的应用与实践经验

tapdata

第二届海南大数据创新应用大赛 - 算法赛道冠军比赛攻略_海南新境界队

阿里云天池

Go语言中高效使用Redis的Pipeline

左诗右码

Go

DeFi质押流动性挖矿系统逻辑开发方案

V\TG【ch3nguang】

Android开发者应该知道的Kotlin_Android/iOS_张龙_InfoQ精选文章