Android 开发者应该知道的 Kotlin

简介:

screenshotAndroid开发者在语言限制方面面临着一个困境。众所周知,目前的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}!") }
    }
}

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

startActivity("id" to res.id, "name" to res.name)

总结

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

====================================分割线================================
文章转载自 开源中国社区[http://www.oschina.net]

目录
相关文章
|
1月前
|
Android开发 Swift iOS开发
iOS和安卓作为主流操作系统,开发者需了解两者差异以提高效率并确保优质用户体验。
【10月更文挑战第1天】随着移动互联网的发展,智能手机成为生活必需品,iOS和安卓作为主流操作系统,各有庞大的用户群。开发者需了解两者差异以提高效率并确保优质用户体验。iOS使用Swift或Objective-C开发,强调简洁直观的设计;安卓则采用Java或Kotlin,注重层次与动画。Swift和Kotlin均有现代编程特性。此外,iOS设备更易优化,而安卓需考虑更多兼容性问题。iOS应用仅能通过App Store发布,审核严格;安卓除Google Play外还可通过第三方市场发布,审核较宽松。开发者应根据需求选择合适平台,提供最佳应用体验。
58 3
|
2月前
|
Android开发 Kotlin
Android经典面试题之Kotlin的==和===有什么区别?
本文介绍了 Kotlin 中 `==` 和 `===` 操作符的区别:`==` 用于比较值是否相等,而 `===` 用于检查对象身份。对于基本类型,两者行为相似;对于对象引用,`==` 比较值相等性,`===` 检查引用是否指向同一实例。此外,还列举了其他常用比较操作符及其应用场景。
184 93
|
15天前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
22 1
|
24天前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
40 4
|
24天前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
17 1
|
1月前
|
IDE Android开发 iOS开发
探索安卓与iOS系统的技术差异:开发者的视角
本文深入分析了安卓(Android)与苹果iOS两大移动操作系统在技术架构、开发环境、用户体验和市场策略方面的主要差异。通过对比这两种系统的不同特点,旨在为移动应用开发者提供有价值的见解,帮助他们在不同平台上做出更明智的开发决策。
|
2月前
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
314 3
|
1月前
|
Android开发 Kotlin
Android面试题之Kotlin中如何实现串行和并行任务?
本文介绍了 Kotlin 中 `async` 和 `await` 在并发编程中的应用,包括并行与串行任务的处理方法。并通过示例代码展示了如何启动并收集异步任务的结果。
18 0
|
1月前
|
Java 调度 Android开发
Android面试题之Kotlin中async 和 await实现并发的原理和面试总结
本文首发于公众号“AntDream”,详细解析了Kotlin协程中`async`与`await`的原理及其非阻塞特性,并提供了相关面试题及答案。协程作为轻量级线程,由Kotlin运行时库管理,`async`用于启动协程并返回`Deferred`对象,`await`则用于等待该对象完成并获取结果。文章还探讨了协程与传统线程的区别,并展示了如何取消协程任务及正确释放资源。
20 0
|
2月前
|
安全 Android开发 开发者
探索安卓开发的未来:Kotlin的崛起与Flutter的挑战
在移动开发的广阔天地中,安卓平台始终占据着举足轻重的地位。随着技术的不断进步和开发者需求的多样化,Kotlin和Flutter成为了改变游戏规则的新玩家。本文将深入探讨Kotlin如何以其现代化的特性赢得开发者的青睐,以及Flutter凭借跨平台的能力如何挑战传统的安卓开发模式。通过实际案例分析,我们将揭示这两种技术如何塑造未来的安卓应用开发。
73 6