您的位置首页>硬件>

Android开发者应该知道的Kotlin

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Android开发者应该知道的Kotlin问题。安卓开发者面临着语言限制的困境。众所周知,

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Android开发者应该知道的Kotlin问题。

安卓开发者面临着语言限制的困境。众所周知,目前的安卓开发只支持Java 6(语言本身从Java 7开始就有所改进),所以我们每天只能使用一种古老的语言进行开发,这大大降低了我们的生产力,迫使我们编写大量的模板和脆弱的代码,但这样的代码很难阅读和维护。幸运的是,安卓程序运行在Java虚拟机上,所以从技术上来说,所有可以在JVM上运行的东西都可以用来开发安卓应用。目前可以生成JVM可以执行的字节码的语言有很多,其中一些语言开始出现并逐渐流行,Kotlin就是其中的佼佼者。

科特林是什么?

Kotlin是一种运行在JVM上的语言。它是由Jetbrains创建的,Jetbrains是许多强大工具背后的公司,例如著名的Java IDE IntelliJ IDEA。Kotlin是一种非常简单的语言,它的主要目标之一是提供一种强大的语言,同时保持简单简洁的语法。其主要特点如下:

轻量级:这对于安卓来说非常重要。项目所需的库应该尽可能小。安卓对方法的数量有严格的限制,Kotlin只增加了大约6000个额外的方法。

互操作性:Kotlin可以与Java语言无缝通信。这意味着我们可以在Kotlin代码中使用任何现有的Java库。因此,即使语言还很年轻,它已经可以使用数百个库。此外,Kotlin代码也可以被Java代码使用,这意味着我们可以使用这两种语言来构建软件。您可以使用Kotlin开发新功能,同时使用Java实现代码库的其他部分。

强类型:我们很少需要在代码中指定类型,因为大多数情况下编译器可以推断变量的类型或者函数的返回值。这样,可以获得两个好处:简单性和安全性。

空安全:Java最大的问题之一就是空。如果变量或参数没有被判断为null,程序中可能会抛出大量的NullPointerException,但这些在编码时很难检测到。Kotlin使用显式null,这迫使我们在必要时检查null。

目前Kotlin的版本是1.0.0 Beta 3,不过官方版本很快就会发布。可以用于生产,现在很多公司已经成功应用了Kotlin。

为什么Kotlin非常适合安卓?

基本上,这是因为Kotlin的所有特性都非常适合安卓生态系统。Kotlin的库非常小,所以我们不会在开发过程中引入额外的成本。它的大小相当于support-v4库,我们在很多项目中使用的库都比Kotlin大。此外,安卓工作室(官方安卓IDE)是基于IntelliJ构建的。这意味着我们的IDE为这种语言提供了出色的支持。我们可以快速配置项目,并使用熟悉的IDE进行开发。我们可以继续使用Gradle和IDE提供的各种运行调试功能。这与使用Java开发应用程序没有什么不同。得益于互操作性,我们可以在Kotlin代码中使用Android SDK,没有任何问题。实际上,一些SDK将变得更容易使用,因为互操作性非常智能。例如,它可以将getters和setters映射到Kotlin属性,我们还可以以闭包的形式编写侦听器。

安卓开发中如何使用Kotlin?

过程很简单,只需遵循以下步骤:

从IDE插件下载Kotlin插件。

在模块中创建Kotlin类。

使用“在项目中配置柯特林……”。

开始编码。

柯特林的一些特点。

Kotlin有很多非常感人的功能,这里无法介绍,但让我们来看看一些最重要的功能。

零安全性

p>

如前所述,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的开发工作。它会提升你的生产力,并且可以通过非常不同且更加简单的方式来解决一些常见的问题。

 

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。