天天看點

Kotlin, Android的SwiftKotlin, Android的Swift

蘋果已經用Swift代替Objective-C,一種古老的語言,來進行iOS的開發了。明顯Android開發也有這個趨勢。

雖然現在已經可以選擇Scala或者Groovy等基于JVM的語言開發Android應用來嘗嘗鮮,但是弊端卻顯而易見。

要引入一個全新的開發語言,那麼就意味着需要引入這個語言的全部的運作時。這簡直就是噩夢。因為這會給

極大的增加應用包的大小,還不說65535方法問題。小的應用還可以,但是這不是一個合适的替代語言應該有的問題。

介紹一下Kotlin--一個基于JVM的語言。由JetBrains(他們開發了IntelliJ IDEA的一個系列和Android Studio)

開發,并由聖彼得堡附近的一個小島命名,負責這個項目的開發團隊就在這個小島辦公。在2011年為外界

所緻,并在幾年後的第二個裡程碑(M2)釋出了對Android的支援(翻譯的時候已經釋出了1.0正式版)。

這個新的語言有什麼特色呢,你可能會問。有很多!不過本文會集中講述Java應該有而一直沒有的上面。

命名參數是一個很簡單的語言特性,但是卻讓代碼更加易讀,尤其是那些有很多參數的函數簽名。

看下面的例子:

在java調用的時候看起來是這個樣子的:

要多次檢視函數簽名才能知道每個參數的具體作用。在Kotlin裡,定義是這樣的:

調用就更好了:

假設我們現在需要把<code>stroke</code>參數設定為可選的,在Java裡你隻能overload出另一個方法,這個方法

少一個參數,然後在裡面調用第一個方法:

但是在Kotlin裡,一切變得簡單:

不是什麼大的功能改進,但是Java始終沒有。

最近函數式程式設計日漸流行。Kotlin也支援lambda表達式。

我們先來看一個簡單的。假設你有一個整數列,而且要删除全部的奇數。

這個函數把list的元素類型為輸入參數類型,這裡是integer。并輸出一個boolean型的結果。如果我們把

filter的lambda表達式轉化為一個明顯的變量寫出來的就更容易了解了:

這一文法和其他的而支援lambda表達式的語言的文法相差不大,是以不多做解釋。

總是要檢查變量是否為null也是Java裡一個很煩人的事。這個問題在Kotlin裡被部分解決。

如果你用傳統的方法定義一個變量,那麼編譯器是不允許其值為null的。

那麼定義的變量的值需要為null怎麼辦呢?你要專門定義一個值可為null的變量。值可為null的變量,用變量

類型後面的問号來明确指定。

調用的時候也需要問号。

這句的意思是:如果<code>text2</code>為空,那麼<code>replace()</code>方法會被忽略并且不會有<code>NullPointerException</code>異常抛出。

如果你接手了一個可選類型(optional type)的變量,你可以百分之百的确認變量的值不會為null(這在Adnroid的API裡

非常多見,雖然方法定義傳回值為空可空類型,但是從來不會傳回null),然後可以強制作為非空調用方法。

這個時候,如果<code>text2</code>為null的話就會抛出<code>NulPointerException</code>異常。是以小心使用。

類型安全的另一個意義是類型檢測。假設你又一個<code>Context</code>的執行個體并且需要檢測這個執行個體是否為<code>Activity</code>類型,然後調用

一些activity才有的方法。

類型檢測之後你就可以把context作為一個activity類型的執行個體來使用了,不需要強制類型轉換。和Java的

<code>instanceOf</code>方法一樣,<code>is</code>也是null安全的。即使<code>getContext()</code>傳回一個null,上面的代碼也

不會崩潰。

在寫資料對象的時候,很多你需要手動實作的,比如:<code>toString()</code>, 'hashCode()<code>以及</code>equals()`。即使

現在很多的IDE已經減輕了一部分工作量,但是添加了新的成員後再更新這些實作也是非常的麻煩。

Kotlin裡不用再為這些操心了。你需要做的隻是在類定義的前面加一個<code>data</code>的修飾,上面的方法就已經隐式的生成了。

如果你初始化上面的類,會自動生成一個人類可以讀懂的<code>toString()</code>方法。

同理,如果我們用同一個名字建立另外一個執行個體,這個執行個體會<code>equal</code>之前建立的執行個體。并且他們的<code>hashCode()</code>值也一樣。

如果你要定制以上的方法,那麼,當然,你還是要手寫的。

單例是一個非常常用的方法。Kotlin省去了建立單例的時候需要的靜态<code>getInstance()</code>方法和私有的構造函數。

Kotlin使用<code>object</code>聲明。

<code>object</code>聲明也可以用來建立靜态方法。

上面的方法可以這樣調用<code>val fragment = MyFragment.newInstance()</code>,就和Java的靜态方法一樣。

雖然Kotlin不支援多繼承, 但是還是支援接口的。隻不過這個接口和<code>Trait</code>比較接近,可以在接口中包括預設實作。

以上接口定義了一個可以關閉session的方法,下面我們在一個activity裡實作這個方法。

有一點需要注意的是Kotlin裡沒有extend和implement的區分,什麼時候都是逗号分隔。

最後我們看一個例子:你可以給一個已經存在的類添加方法。

比如你要建立一個方法,這個方法可以把字元串的空白替換為下劃線。在Java裡你需要建立一個Utility的方法,以

原始字元串為參數。

在Kotlin裡,你可以建立一個擴充方法(extension function),即使原類是<code>final</code>的。

為了公平起見,以上說到的大部分特性在Java8裡都已經有了。但是這些什麼時候可以在Android裡用到可能

就遙遙無期了(其實這個問題已經有人在2014的Google I/O裡問過了,但是根據Xavier Ducrohet的說法近期沒有這樣的計劃)。

還好現在有Kotlin了。

另外,這個語言已經非常的成熟。唯一的問題就是文檔經常補全而且還經常是過期的,不過因為文法和同時JVM語言的Scala多少

有些接近,多少可以猜出個大概。是以,這隻是一個很小的瑕疵。

最後的最後,Kotlin将會在我(作者)後續的Android開發中盡可能的使用。顯然,對已有的代碼做轉化不太明智。

而且Kotlin可以和Java的代碼無縫互操作,這樣不是什麼太大的問題。Kotlin很值得一試!

歡迎加群互相學習,共同進步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,轉載請注明出處!

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sunshine-anycall/p/5223158.html,如需轉載請自行聯系原作者

繼續閱讀