Kotlin是一門基于JVM的編程語言,它正成長為Android開發(fā)中用于替代Java語言的繼承者。Java是世界上使用最多的編程語言之一,當其他編程語言為更加便于開發(fā)者使用而不斷進化時,Java并沒有像預期那樣及時跟進。
Java缺失的很多特性在最新的修訂版中逐漸覆蓋到了,但Android開發(fā)者暫時還沒能夠使用它們。這就使得類似Kotlin這樣的語言有了用武之地了:在舊的開發(fā)環(huán)境中使用現(xiàn)代語言的特性。
Kotlin是由JetBrains創(chuàng)建的基于JVM的編程語言,IntelliJ正是JetBrains的杰作,而Android Studio是基于IntelliJ修改而來的。Kotlin是一門包含很多函數(shù)式編程思想的面向對象編程語言。
Kotlin生來就是為了彌補Java缺失的現(xiàn)代語言的特性,并極大的簡化了代碼,使得開發(fā)者可以編寫盡量少的樣板代碼。
首先我必須聲明我使用Kotlin的時間并不長,我?guī)缀跏沁厡W習邊寫這一系列博客的。我沒有嘗試其他替代語言例如Go或者Scala,因此如果你真的想要切換到另一門語言之前,我建議先搜索其他人是如何評價其他語言的。使用Scala開發(fā)Android的一個很棒的例子可以在47deg的Github上面找到。
下面是我為什么選擇Kotlin進行學習的理由:
在你作任何決定之前我推薦先閱讀一篇由Jake Wharton寫的有趣的文章:在Android開發(fā)中使用Kotlin
使用Kotlin可以很容易避免樣板代碼的編寫,因為語言本身已經(jīng)默認覆蓋了大多數(shù)典型的情況。
例如,在Java中如果要創(chuàng)建一個典型的數(shù)據(jù)模型類,我們需要編寫(或者至少生成)如下代碼:
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進行開發(fā)時,大部分代碼都是防守型的。我們需要在使用之前不斷的檢測對象是否為空,如果我們不想在代碼運行時得到非預期的NullPointerException。類似其他很多編程語言,Kotlin是空類型安全的,因此我們需要使用安全調用操作符顯式指明對象是否能夠為空。
我們可以類似這樣聲明:
//This won′t compile. Artist can′t be nullvar notNullArtist: Artist = null//Artist can be nullvar artist: Artist? = null// Won′t compile, artist could be null and we need to deal with thatartist.print()// Will print only if artist != nullartist?.print()// Smart cast. We don′t need to use safe call operator if we previously checked nullityif (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 nullval name = artist?.name ?: "empty"
我們可以為任何類添加新函數(shù)。相比我們工程中普遍存在的傳統(tǒng)的工具類,擴展函數(shù)更具可讀性。例如,我們可以為fragments添加一個新函數(shù),用于顯示一個toast:
fun Fragment.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { Toast.makeText(getActivity(), message, duration).show()}
然后可以這樣調用:
fragment.toast("Hello world!")
每次當我們創(chuàng)建一個新的listener時,都需要聲明一個onClick函數(shù)用于處理監(jiān)聽回調,我們可以直接編寫監(jiān)聽回調的代碼而不用聲明onClick函數(shù)嗎?答案是肯定的。這(包括其他很多有趣的功能)得歸功與lambda表達式的運用:
view.setOnClickListener({ toast("Hello world!") })
譯者注:本小節(jié)所列出的限制,在最新版的Kotlin中已經(jīng)都解決了,僅供讀者目睹Kotlin語言的完善和進化過程。
Kotlin目前還處于開發(fā)階段,雖然已經(jīng)很穩(wěn)定而且最終release版本即將發(fā)布(這個夏天),但在Android開發(fā)中存在如下限制:
更新:在Kotlin M12已經(jīng)帶來了對注解處理的支持。
更新:Kotlin M11發(fā)布了并包含了輔助構造函數(shù)。
更新:Kotlin M12的gradle plugin現(xiàn)在支持Android Studio中的單元測試了。
Kotlin是開發(fā)Android app中使用的Java語言的一個有趣的替換者。下一篇文章我們將描述使用Kotlin如何新建一個新工程,并講解如何充分利用Kotlin使Android開發(fā)更容易。敬請關注!
文末攝影鑒賞