写点什么

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

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

关注

评论 1 条评论

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

测试开发之网络篇-IP地址

禅道项目管理

IP 协议 IP地址

从五大结构体,带你掌握鸿蒙轻内核动态内存Dynamic Memory

华为云开发者联盟

鸿蒙 内存管理 结构体 动态内存 Dynamic Memory

Rust从0到1-自动化测试-如何编写测试

rust 自动化测试 如何编写测试 Automated Tests

用node写个简单的脚手架!

Node cli

腾讯同事内推的那位Linux C/C++后端开发同学面试没过......

Linux服务器开发

Linux C/C++ Linux服务器开发 Linux后台开发 Linux网络编程

如何设计好一个接口

🎄新

架构 设计 接口

CloudQuery 使用教程之《No.1 基础入门》

BinTools图尔兹

数据库 程序员 dba 国产数据库 运维开发

网络攻防学习笔记 Day54

穿过生命散发芬芳

网络攻防 6月日更

4个改变你编程技能的小技巧,建议细读

欢喜学安卓

android 程序员 面试 移动开发

Quick BI的可视分析之路

瓴羊企业智能服务

阿里云 数据中台 数据分析 数据可视化 商业分析

RS485通信如何设计EMC电路?

不脱发的程序猿

电路设计 通信总线 RS485 EMC设计 通信抗干扰

不愧是Alibaba技术官,Kafka的精髓全写这本“限量笔记”里,服了

Java 架构 面试 分布式

限量!Alibaba首发“Java成长笔记”,差距不止一点点

Java 编程 程序员 架构 面试

自定义 View 功能上线,你的小程序可以更多变

蚂蚁集团移动开发平台 mPaaS

小程序 mPaaS 自定义控件

Python接口自动化之常见用例读取方法介绍

行者AI

测试 #python

一觉醒来,发现自建的数据库被勒索了,好可怕…

华为云数据库小助手

数据库 高可用 安全性 DAS

EBean ORM 框架介绍-3.实体草稿功能

Barry的异想世界

jpa ORM Ebean

windows11泄露版尝鲜体验新功能!!!

学神来啦

win10 win11 windows10 windows 11

最强大的内在激励:自我承诺

石云升

激励 职场经验 管理经验 6月日更

构建WEB项目的 25 个HTML建议

devpoint

html 6月日更

马士兵强推面试前必刷:Alibaba内部Java高级架构师380道面试题

Java架构追梦

Java 阿里巴巴 面试 java架构

nodejs学习记录

Node

4面字节跳动拿到Offer,灵魂拷问

欢喜学安卓

android 程序员 面试 移动开发

高性能计算对生命科学研究有何帮助?

北鲲云

云计算 高性能计算 生命科学 虚拟筛选

去中心化的互联网,区块链域名如何对抗在线审查

CECBC

一进商场就迷路?ThingJS用室内导航拯救路痴!

ThingJS数字孪生引擎

程序员 大前端 可视化 3D可视化 数字孪生

“区块链指导意见”重磅发布 场景化应用昭示新蓝海

旺链科技

区块链应用 区块链供应链金融落地

为什么vacuum后表还是继续膨胀?

华为云开发者联盟

索引 GaussDB 元组 VACUUM 行存表

企业想要升级生产管理系统,有哪些好用的低代码平台推荐?

优秀

低代码

从网络平台到城市平台——城市数字化的另类思考

CECBC

Flutter&Dart Callback转同步

小呆呆666

flutter ios android 大前端

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