AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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:227432
用户头像

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

关注

评论 1 条评论

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

云原生运维文章计划

boaker

运维 云原生

怎样能低成本构建一个电商平台

Geek_99967b

小程序 电商

Docker 化 Vue2 应用开发

devpoint

Docker Docker 镜像 6月月更

flutter系列之:flutter中的变形金刚Transform

程序那些事

flutter 程序那些事 6月月更

攻防演练中蓝队针对攻击方式复盘总结

穿过生命散发芬芳

6月月更 攻防演练

去哪儿网(Qunar) DevOps 实践分享

laofo

DevOps cicd 研发效能 持续交付 工程效率

从22行有趣的源码库中,我学到了 callback promisify 化的 Node.js 源码实现

若川

JavaScript node.js 前端 前端开发 Node

K8S学习笔记--《容器化的应用:会了这些你就是Docker高手》

IT蜗壳-Tango

IT蜗壳教学 6月月更

深入理解 Jetpack Compose SlotTable 系统

fundroid

android Compose android jetpack SlotTable gap buffer

【使用Python实现算法】01 语言特性

★忆先★

Python 算法 算法题

在线JSON转PlainText工具

入门小站

工具

企业架构师面试的100个问题

涛哥 数字产品和业务架构

企业架构师

剑指 Offer 65. 不用加减乘除做加法

未见花闻

6月月更

云厂商为什么都在冲这个KPI?

脑极体

【使用Python实现算法】02 原生类型与内置函数

★忆先★

Python 算法题

SpringBoot-入门

zarmnosaj

6月月更

初学者也能看懂的 Vue2 源码中那些实用的基础工具函数

若川

JavaScript Vue 前端 前端开发

不得利用算法从事垄断行为:防范利用算法和大数据进行杀熟

石头IT视角

Java Core「18」JCF 及常见问题

Samson

学习笔记 Java core 6月月更

50行代码串行Promise,koa洋葱模型原来是这么实现?

若川

JavaScript 前端 Node Jest koa2

从小到大为何一谈学习就愁眉苦脸

宇宙之一粟

学习 6月月更

linux检测系统是否被入侵(上)

入门小站

Linux

为什么 Vue2 this 能够直接获取到 data 和 methods,源码揭秘

若川

JavaScript Vue 前端 前端开发 源码解析

信通院举办“业务与应用安全发展论坛” 天翼云安全能力再获认可

极客天地

每次新增页面复制粘贴?100多行源码的 element-ui 新增组件功能告诉你减少重复工作

若川

JavaScript Vue 前端 Element Element UI

每次启动项目的服务,电脑竟然乖乖的帮我打开了浏览器,100行源码揭秘!

若川

JavaScript 前端 前端开发 Node

Java中数组参考指南

okokabcd

Java’

新手向:前端程序员必学基本技能——调试JS代码

若川

JavaScript 前端 前端开发 调试 Node

自定义MySQL连接池

FunTester

Flutter SliverAppBar全解析,你要的效果都在这了!

yechaoa

flutter android 6月月更 SliverAppBar

面对 this 指向丢失,尤雨溪在 Vuex 源码中是怎么处理的

若川

JavaScript Vue 前端 前端开发 vuex

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