@author ASCE1885的 Github 简书 微博 CSDN
原文链接Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者。Java是世界上使用最多的编程语言之一,当其他编程语言为更加便于开发者使用而不断进化时,Java并没有像预期那样及时跟进。
Java缺失的很多特性在最新的修订版中逐渐覆盖到了,但Android开发者暂时还没能够使用它们。这就使得类似Kotlin这样的语言有了用武之地了:在旧的开发环境中使用现代语言的特性。
Kotlin是由 JetBrains 创建的基于JVM的编程语言,IntelliJ正是JetBrains的杰作,而Android Studio是基于IntelliJ修改而来的。Kotlin是一门包含很多函数式编程思想的面向对象编程语言。
Kotlin生来就是为了弥补Java缺失的现代语言的特性,并极大的简化了代码,使得开发者可以编写尽量少的样板代码。
首先我必须声明我使用Kotlin的时间并不长,我几乎是边学习边写这一系列博客的。我没有尝试其他替代语言例如Go或者Scala,因此如果你真的想要切换到另一门语言之前,我建议先搜索其他人是如何评价其他语言的。使用Scala开发Android的一个很棒的例子可以在 47deg的Github 上面找到。
下面是我为什么选择Kotlin进行学习的理由:
在你作任何决定之前我推荐先阅读一篇由Jake Wharton写的有趣的文章: 在Android开发中使用Kotlin
使用Kotlin可以很容易避免样板代码的编写,因为语言本身已经默认覆盖了大多数典型的情况。
例如,在Java中如果要创建一个典型的数据模型类,我们需要编写(或者至少生成)如下代码:
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)
当我们使用Java进行开发时,大部分代码都是防守型的。我们需要在使用之前不断的检测对象是否为空,如果我们不想在代码运行时得到非预期的NullPointerException。类似其他很多编程语言,Kotlin是空类型安全的,因此我们需要使用安全调用操作符显式指明对象是否能够为空。
我们可以类似这样声明:
//This won´t compile. Artist can´t be null var notNullArtist: Artist = null //Artist can be null var artist: Artist? = null // Won´t compile, artist could be null and we need to deal with that artist.print() // Will print only if artist != null artist?.print() // Smart cast. We don´t need to use safe call operator if we previously checked nullity if (artist != null) { artist.print() } // Only use it when we are sure it´s not null. Will throw an exception otherwise. artist!!.print() // Use Elvis operator to give an alternative in case the object is null val name = artist?.name ?: "empty"
我们可以为任何类添加新函数。相比我们工程中普遍存在的传统的工具类,扩展函数更具可读性。例如,我们可以为fragments添加一个新函数,用于显示一个toast:
fun Fragment.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(getActivity(), message, duration).show() }
然后可以这样调用:
fragment.toast("Hello world!")
每次当我们创建一个新的listener时,都需要声明一个onClick函数用于处理监听回调,我们可以直接编写监听回调的代码而不用声明onClick函数吗?答案是肯定的。这(包括其他很多有趣的功能)得归功与lambda表达式的运用:
view.setOnClickListener({ toast("Hello world!") })
译者注:本小节所列出的限制,在最新版的Kotlin中已经都解决了,仅供读者目睹Kotlin语言的完善和进化过程。
Kotlin目前还处于开发阶段,虽然已经很稳定而且最终release版本即将发布(这个夏天),但在Android开发中存在如下限制:
更新:在Kotlin M12已经带来了对注解处理的支持。
更新:Kotlin M11发布了并包含了 辅助构造函数 。
更新:Kotlin M12的gradle plugin现在支持Android Studio中的单元测试了。
Kotlin是开发Android app中使用的Java语言的一个有趣的替换者。下一篇文章我们将描述使用Kotlin如何新建一个新工程,并讲解如何充分利用Kotlin使Android开发更容易。敬请关注!
文末摄影鉴赏