標籤:
關於Kotlin,網上已有一些介紹的文章,包括Antonio Leiva的這組blog翻譯稿。不過,我還是想跟進它們、翻譯它們,以鍛煉自己的英文翻譯。各位高手發現問題,請及時“拍磚”。
原文題目:Kotlin for Android (I): Introduction(http://antonioleiva.com/kotlin-for-android-introduction/)
原文Antonio Leiva(http://antonioleiva.com/about/)
原文發布:2015-03-09
Kotlin是眾多基於JVM的程式設計語言之一。在Android開發中,它可能成為Java繼承者。Java是世界上最常用的語言之一,當很多其他程式設計語言為了更加方便程式員使用在不斷髮展時,Java卻沒有能夠像預期那樣及時跟上。
Java的很多不足之處,都在最新的修訂版得以修複了,但是Android開發人員暫時還使用不到它們。這是使用Kotlin和類似語言的吸引力:在目前的開發環境下使用先進的編程技術。
Kotlin是什嗎?
Kotlin是由JetBrains(https://www.jetbrains.com/)建立的基於JVM的程式設計語言,IntelliJ也是JetBrains團隊的,而Android Studio又是基於IntelliJ而來的。它是包括很多函數式編程思想的物件導向程式設計語言。
Kotlin正是為彌補Java那些缺憾而生的。它極大簡化代碼,使我們節省編寫大量的樣板代碼工作。
為什麼要使用Kotlin?
首先,我申明我使用Kotlin的時間不長,我幾乎是一邊學習,一邊寫這些文章。我還沒有試過其他語言,如:GO或Scala,所以你如果真的想換其他語言,我建議你先搜尋其他人是如何評價你要轉換程式設計語言。可以在Github的47deg項目(http://47deg.github.io/translate-bubble-android/)中找到使用Scala語言開發Android應用的好例子。
這些是我為什麼選擇Kotlin學習研究的原因:
- 相對快速地學習曲線(路徑):與Scala執行個體相比,我們進入更簡潔領域。Kotlin雖有很多限制,但是即使你之前從未使用過現代語言,從它起步也很容易。
- 輕量級:Kotlin程式碼程式庫比其他語言的都小。這點很重要。因為Android方法的限制總是一個問題,儘管有其它解決方案(如:proguard或multidexing),但是所有這些解決方案都很複雜,在調試時很費時。Kotlin增加的方法少於7000個,與support-v4差不多。
- 可互通性高:它能夠很好地與其它Java程式碼程式庫一起運行,而且互操作非常簡單。這是Kotlin團隊開發新語言時牢記的主要觀點之一。他們希望用它來繼續開發目前用Java開發的項目,而不需要重寫整個代碼。所以Kotlin需要與Java代碼有極佳地可互通性。
- 完美地與Android Studio和Gradle整合:我們有IDE外掛程式和Gradle外掛程式,這樣用Kotlin開發Android項目沒有困難(我將在下一篇文章中討論)。
- 在做決定之前,我建議先閱讀Jake Wharton所著《使用Kotlin進行android開發》(https://docs.google.com/document/d/1ReS3ep-hjxWA8kZi0YqDbEhCqTt29hG8P44aA9W0DM8/edit?hl=es&forcehl=1)文章。這是一篇令人關注的文章。
從Kotlin中我們得到什嗎?
1、運算式
使用Kotlin,由於程式設計語言的預設值已經覆蓋多數典型的情況,所以可以容易的避免編寫樣板代碼。
例如,在Java中,如果要建立一個典型的資料類,就需要寫(或至少產生)這樣代碼:
1 public class Artist { 2 private long id; 3 private String name; 4 private String url; 5 private String mbid; 6 7 public long getId() { 8 return id; 9 }10 11 public void setId(long id) {12 this.id = id;13 }14 15 public String getName() {16 return name;17 }18 19 public void setName(String name) {20 this.name = name;21 }22 23 public String getUrl() {24 return url;25 }26 27 public void setUrl(String url) {28 this.url = url;29 }30 31 public String getMbid() {32 return mbid;33 }34 35 public void setMbid(String mbid) {36 this.mbid = mbid;37 }38 39 @Override public String toString() {40 return "Artist{" +41 "id=" + id +42 ", name=‘" + name + ‘\‘‘ +43 ", url=‘" + url + ‘\‘‘ +44 ", mbid=‘" + mbid + ‘\‘‘ +45 ‘}‘;46 }47 }
用Kotlin需要多少代碼?資料類就這麼簡單:
1 data class Artist(2 var id: Long, 3 var name: String, 4 var url: String, 5 var mbid: String)
2、空型別安全
在用Java開發時,大多數代碼都是預防性的。為了不遇到非預期的NullPointerException,在使用之前,要不斷的檢測對象是否為空白。與許多其它語言一樣,因為需要使用安全調用運算子顯式指明對象是否能夠為空白(null),所以Kotlin是空型別安全的(http://kotlinlang.org/docs/reference/null-safety.html)。
可以這樣做:
1 //This won´t compile. Artist can´t be null 2 var notNullArtist: Artist = null 3 4 //Artist can be null 5 var artist: Artist? = null 6 7 // Won´t compile, artist could be null and we need to deal with that 8 artist.print() 9 10 // Will print only if artist != null11 artist?.print()12 13 // Smart cast. We don´t need to use safe call operator if we previously checked nullity14 if (artist != null) {15 artist.print()16 }17 18 // Only use it when we are sure it´s not null. Will throw an exception otherwise.19 artist!!.print()20 21 // Use Elvis operator to give an alternative in case the object is null22 val name = artist?.name ?: "empty"
3、擴充函數
可以為任何類添加新函數。在項目中,替代已有的典型公用程式類可使代碼更具可讀性。例如,為fragment添加新函數,用於顯示toast:
1 fun Fragment.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {2 Toast.makeText(getActivity(), message, duration).show()3 }
現在可以這樣做:
1 fragment.toast("Hello world!")
4、函數式支援(Lambdas)
如果不想在每次聲明點擊操作應該做什麼時建立一個新listener,可以直接定義想要做什麼嗎?答案是肯定的。這(包括許多更有趣的功能)都歸功與Lambda運算式的運用:
1 view.setOnClickListener({ toast("Hello world!") })
目前的限制
儘管Kotlin十分穩定並且很快(今年夏天)就要發布最終版本,但是它仍然在開發中,用於android應用開發還有一些限制:
- 與autogenerated code的互通性:有些知名的Android庫,如:Dagger或Butterknife,它們依賴autogenerated code,由於有些命名不相容,而不能工作。Kotlin團隊在處理此問題,有一天會解決的(KT-6444:https://youtrack.jetbrains.com/issue/KT-6444)。不管怎樣,如我在下一篇文章中說明的,語言表達能力可使我們認為不需要那些庫。
更新:現在Kotlin M12引入支援注釋處理。
- 自訂視圖聲明方法不夠簡單:Kotlin類僅能聲明一個建構函式,而自訂視圖通常需要三個。如果使用類編程方式,這不是一個問題,但是XML用法就不夠了。最簡易的變通方式是在Java中聲明這些類,而後在Kotlin中使用它們。Kotlin團隊承諾在M11版本中解決(https://youtrack.jetbrains.com/issue/KT-2095)。
更新:Kotlin M11發布了,並包括輔助建構函式(http://kotlinlang.org/docs/reference/classes.html#constructors)。
- Android項目的JUnit測試:在Kotlin中,Android Studio 1.1的新增特性還可能使用。順便說一下,在純Kotlin項目中,Instrumentation測試和JUnit測試是全功能的。
更新:Kotlin M12 Gradle外掛程式現在可以用於單元測試了。
總結
對於開發Android APP,Kotlin是令人關注的Java替代者。下篇文章將說明怎樣用Kotlin建立一個新項目,以及怎樣發揮語言特色,使Android開發更容易。敬請關注!
用Kotlin開發Android應用(I):介紹