每個Android程式設計師應該知道的Kotlin
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}!") } } }
它還提供了其他一些很有用的特性。比如說,導航到其他Activity:
startActivity ("id" to res.id, "name" to res.name)
總結
如你所見,Kotlin在很多方面都簡化了Android的開發工作。它會提升你的生產力,並且可以通過非常不同且更加簡單的方式來解決一些常見的問題。
相關文章
- 每個程式設計師都應該知道的下一個程式語言——Kotlin程式設計師Kotlin
- 每個程式設計師應該知道12件事程式設計師
- 每個程式設計師應該知道的12個API程式設計師API
- 每個程式設計師都應該知道的 15 個最佳 PHP 庫程式設計師PHP
- 每個程式設計師都應該知道的基礎數論程式設計師
- 每個程式設計師應該知道的計算機網路知識程式設計師計算機網路
- 關於 Unicode 每個程式設計師應該知道的 5 件事Unicode程式設計師
- 程式設計師應該知道的 13 個設計技巧程式設計師
- 每個程式設計師都該知道的編碼準則程式設計師
- 每個程式設計師都應該讀的書程式設計師
- 每個Python新手都應該知道的程式設計技巧Python程式設計
- 每個程式設計師都該知道的五大定律程式設計師
- 每個程式設計師都應該成為架構師程式設計師架構
- 每個程式設計師都應該讀《Unix程式設計藝術》程式設計師
- 每個程式設計師都該知道的10大編碼原則程式設計師
- Python 程式設計師應該知道的 10 個庫Python程式設計師
- 程式設計師都應該知道的福利程式設計師
- Java程式設計師應該知道的20個有用的庫Java程式設計師
- 國外程式設計師推薦:每個程式設計師都應該讀的非程式設計書程式設計師
- Java程式設計師應該知道的10個除錯技巧Java程式設計師除錯
- 前端程式設計師應該知道的 15 個 jQuery 小技巧前端程式設計師jQuery
- 『翻譯』每個程式設計師第一份工作前應該知道的10件事程式設計師
- 程式設計師最應該知道的20件事程式設計師
- 關於Unicode,字符集,字元編碼,每個程式設計師都應該知道的事Unicode字元程式設計師
- 每個Android開發者應該知道的6個SDK和APIAndroidAPI
- Rework:每個程式設計師都應該讀的一本書程式設計師
- 每個程式設計師都應該學會分解複雜的方法程式設計師
- 每個程式設計師都應該瞭解的硬體知識程式設計師
- 每個程式設計師都應該參加一次 GDD程式設計師
- 程式設計師應該知道的97件事程式設計師
- 每個程式設計師應該閱讀的10本經典書籍程式設計師
- 每個程式設計師都應該瞭解的記憶體知識程式設計師記憶體
- Java程式設計師應該知道的10個物件導向理論Java程式設計師物件
- 程式設計師每週該做的事情!程式設計師
- 每個程式設計師都應該學習使用Python或Ruby程式設計師Python
- 程式設計師每天每週每月每年應該做的事程式設計師
- 程式設計師最應該知道的一些事程式設計師
- 新手程式設計師應該知道的7件事程式設計師