Android平臺的Swift—Kotlin

WeTest 導讀

Kotlin 已經出來較長一段時間了,有些同窗已經對Kotlin進行了深刻的學習,甚至已經運用到了本身的項目當中,可是還有較多同窗可能只是聽過Kotlin或簡單瞭解過,這篇文章的目的是讓這些同窗對Kotlin有一個系統全面的認識,讓有興趣的同窗在以後學習的時候能更加的輕車熟路。html

 


 

什麼是kotlin?

1、一門靜態編程語言

跟java,c同樣的強類型語言,變量的數據類型在編譯時肯定。對比的JavaScript,python則是動態編程語言。java

 

2、JetBrians開發設計

一家捷克的軟件公司,是著名的IDE開發商,對不少的開發語言和平臺都提供了相應的集成開發環境,好比Java的,OC的,JavaScript,PHP,C/C++等。而其中最著名的是IntelliJ IDEA ,Java的集成開發環境,被稱爲目前最好用的java IDE。並且Android Studio就是Google基於IntelliJ IDEA 開發的,因而可知Google和JetBrains的合做也是比較密切的。而從以上說明也能夠看到JetBrains不只實力強勁,這家公司對於語言設計更是有自然優點。Kotlin是集多家語言之大成。python

 

3、Kotlin是開源的(基於Apache 2.0開源許可協議)

咱們在GitHub上能夠下載Kotlin的所有源代碼。並且能夠本身進行代碼修改,再發布。android

 

https://github.com/JetBrains/kotlin git

 最新版本已經更新到了1.2.3 。程序員

 

4、Android官方開發語言

JetBrains其實在2011年就推出了Kotlin, 在以後的很長一段時間都處於設計,開發和完善當中,2016年才發佈第一個正式版本,而在2017年5月份的Google I/O開發者大會上,被Google宣佈稱爲Android的官方開發語言。github

被程序員們稱爲Android平臺的Swift。編程

 

Kotlin有哪些優點?

1、 語法簡潔,且吸取了不少其餘語言的優勢

 

大量的語法糖(有函數聲明,類的建立,集合相關,範圍運算符等等大量簡潔的語法)、 Lambda表達式(Java8支持),簡潔的函數表示法,後面會介紹到。swift

 

可參考:http://qinghua.github.io/kotlin-syntax-suger/ 收集的語法糖們。segmentfault

 

吸取其餘語言的優勢有:模板字符串,運算符重載,方法擴展,命名參數等。後面在語言新特性中會講到。

 

 

2、安全性

 

空安全:避免空指針異常。當變量能夠爲null時,必須使用可空安全符?進行聲明,不然會出現編譯錯誤。聲明變量爲可空後,在運行時便不會拋出異常。

 

類型智能轉換:經過is進行類型判斷後,編譯器自動進行類型轉換。父類引用能夠調用子類接口,注意轉換隻在is的代碼塊中生效。

 

3、徹底兼容Java

相似於swift於OC的關係,雖然官方推薦使用新語言Kotlin進行Android開發,可是前提新語言必須兼容舊語言(不然是沒法獲得google的承認的)。因此Kotlin的設計初衷就是要徹底兼容Java。

 

相互調用:使用Kotlin進行Android或者Java服務端開發,能夠導入任意的Java庫。Kotlin和Java之間能夠相互調用。

 

相互轉換:在Android Studio中能夠一鍵轉換Java代碼爲Kotlin代碼(Code > Convert Java File to Kotlin File.)。同時Kotlin代碼也能夠反編譯成Java代碼(1.Tools>Kotlin>Show Kotlin Bytecode 2.Decompile)。

 

Java的API = Kotlin的API。

 

4、工具支持

JetBrains爲Kotlin的開發提供了大量的工具支持。咱們能夠直接下載Kotlin Compiler庫在命令行進行編譯和運行,也能夠經過安裝插件在Eclipse中使用Kotlin,而如今IntelliJ IDEA和Android Studio已經能夠直接使用Kotlin進行開發。就像JetBrains所說:一門語言須要工具化,而在 JetBrains,這正是咱們作得最好的地方!

 

Kotlin如何兼容Java?

咱們來看一張圖,瞭解Kotlin的編譯過程。

 

Kotlin爲何能夠兼容Java,一個主要緣由是Kotlin文件在通過Kotlin編譯器編譯後會生成Java字節碼。這跟Java文件經過Java編譯器編譯後生成的字節碼幾乎沒有區別,這樣JVM就能直接識別和處理Kotlin代碼的功能和邏輯。

 

當Kotlin調用Java代碼,Kotlin編譯器會對調用的Java文件進行分析,以便kt文件可以生成正確的class文件。爲何這麼說呢?舉個列子,Java字節碼有幾種函數調用的方式invokespecial 、 invokeStatic 、 invokeInterface等,編譯器必須知道調用的Java函數是什麼類型才能生成相應的正確的字節碼。而當在Java代碼中調用Kotlin對象時,Kotlin生成的class文件也要輸入到Java編譯器,這時Java文件才能生成正確的class文件。生成的class文件打成jar包後,最終能夠生成Android的APK,或供Java服務端調用。

 

咱們能夠直接下載下載Kotlin編譯器下來查看他的編譯過程(最新https://github.com/JetBrains/kotlin/releases/tag/v1.2.40-eap-16)。Kotlin編譯器的代碼都是用java寫的,因此使用Kotlin編譯器必需要有java環境。

 

Kotlin的語言特性

1、基礎特性

一、 定義變量

 

 Var用來聲明變量,Val相似Java final,用來聲明常量。語句後面不須要跟分號。變量類型能夠根據變量值進行自動推導。這裏Kotlin的基礎類型都是對象,使用的是Java的包裝類(基礎類型包裝成對象)。

 

二、定義函數

 

函數使用fun爲關鍵字進行聲明。變量的冒號以後是變量類型,函數的冒號以後是返回值。

 

同時咱們能夠在定義函數的時候聲明參數的默認值。

函數調用的時候能夠直接調用,也可使用命名參數:

 

使用命名參數能夠增長可讀性,減小函數的重載。

 

 

三、類的聲明

 

 

類名的冒號表示繼承,全部類的基類稱爲Any(並非Object,只包含equals、hascode、toString方法)。聲明構造函數要指明constructor關鍵字。

 

 

也能夠直接在聲明類的時候指定構造函數。

對象實例化能夠不寫new關鍵字:

 

 

數據類,用來保存Info數據的類,其實就是JavaBeans。這裏使用一句代碼建立一個包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 類。

 

4.、流程控制

其餘流程控制基本跟Java差很少,這裏主要講下when表達式,他取代了Java的switch

 

when表達式其實最終是使用if/else來實現的。

保留了原來的for each循環,同時增長了區間控制

 

五、集合

Kotlin的集合與OC的集合類似,分爲可變集合和不可變集合(lists、sets、maps 等)。

 

kotlin中的可變集合對Java的集合進行了包裝,同時它實現了一套不可變集合庫。

 

訪問:

 

六、伴生對象

Kotlin中沒有靜態屬性和方法。若是咱們要建立單列,可使用Object關鍵字聲明類

 

若是要在一個類裏面聲明靜態成員,能夠在類的內部使用伴生對象。使用關鍵字companion object

 

調用的話,直接跟Java同樣,經過類名點屬性名稱或函數名稱調用。

 

2、新特性

一、空安全

Kotlin是如何實現空安全的呢?

在Kotlin中,對象聲明分爲可空引用和非空引用兩種。

 

非空引用:

 

可空引用:

 

安全調用操做符,寫做 ?. 可空調用:

 

經過函數調用給可空引用賦值,返回的必須也是可空引用。這就在編譯期間杜絕了空指針異常。可是這裏要注意一點,若是從Java返回的集合,不會強制作可空檢查,這個是時候若是給不可空引用賦值Java集合中的null會出現轉換錯誤異常。

 

二、擴展函數

跟OC的Category同樣,能夠對API的函數進行擴展。

 

咱們在任意Activity中均可以直接調用

 

函數擴展並非修改了原來的類,經過反編譯成Java代碼能夠發現,函數的擴展是經過靜態導入的方式實現的。

 

三、字符串模板

表示字符串中能夠包含變量或者表達式,以$符號開頭(這跟JSP的EL表達式有點像),好比:

 

Kotlin中是經過單引號進行轉義的

 

四、操做符重載

Kotlin爲基本的運算符提供了固定名稱函數表,好比

 

 

示例:

 

 

調用:

 

五、Lambda表達式

Lambda本質上是一個未聲明的函數,他會以表達式的形式傳遞。既然是函數,就由這三塊組成:參數 、 方法體 和 返回值。

 

咱們來看一下完整的Lambda表達式是怎麼寫的:

 

大括號內,箭頭左邊是參數,箭頭右側是方法體和返回值。這裏傳入兩個Int類型的參數,返回一個Int類型的值。 

 

聲明一個接受函數爲參數的函數:

 

 第二個參數rightV代表接受的是一個函數,函數有兩個Int型的入參,返回一個Int型的輸出。

 

調用:

 

在Android中使用Lambda表達式,能夠寫成

 

省略了函數的括號。這裏本來不是傳入函數類型參數,是編譯器作的處理。

 

注意:listener有多個接口聲明時,不能這麼使用,好比setOnCheckedChangeListener

 

3、高級特性

一、高階函數

把函數做爲參數或者是返回值的函數,Kotlin稱之爲高階函數。好比函數:

 

 

就是一個高階函數。能夠這麼調用:

 

咱們聲明一個局部函數,而後把他做爲參數傳遞給另外一個函數。咱們還可使用Lambda表達式來表示函數參數。

 

二、泛型

泛型的存在主要是爲了消除模板代碼和類型轉換安全, 在Kotlin中泛型的使用基本與Java是一致的。

 

在Java中泛型是不變的,好比:雖然A繼承B,但List<A>和List<B>之間沒有任何關係,Java是經過泛型通配符來實現型變的:

<? extends T> 對應Kotlin的 out T 生產者

<? super T> 對應Kotlin的  in T 消費者

 

PECS原則 : producer-extends, consumer-super

可是Kotlin中使用比Java的更加靈活,好比能夠在類聲明的時候添加型變 , 或者函數聲明的時候添加。

 

更多能夠了解:https://segmentfault.com/a/1190000010313252 寫的很是詳細。對Java泛型理解的不是很透徹能夠再看看 http://www.importnew.com/24029.html

 

三、反射

在運行時獲取類的方法,屬性,類結構等全部信息。

1)Kotlin中使用Java的反射

 

jc返回的是Java的class對象,能夠經過這個對象去調用調用Java的反射。

 

2)Kotlin中的反射:

 

能夠不經過KClass對象,直接調用方法和訪問屬性(注意:若是有重載的函數或同名的屬性不能使用如下方式)。

 

四、協程

什麼是協程?

協程是一種新的異步編程方式,它使用線程爲資源,基於代碼邏輯去實現任務之間的調度。它主要是由編譯器去實現的。

 

程序使用協程能夠書寫線性的異步代碼,沒有callback,大大簡化了異步編程。線程有的異步操做協程都支持,協程的掛起和切換很是輕量基本沒有開銷。

 

如何使用協程?

 

協程目前雖然還在試驗階段,可是功能已經很是完善了(如今Kotlin最新1.2.3版本,預計1.3會刪除實驗室狀態)。有興趣的同窗能夠參考:

https://www.kotlincn.net/docs/tutorials/coroutines-basic-jvm.html

 

kotlin跨平臺

1、多平臺支持

Kotlin的不只僅用於Java,JetBrains的野心遠不止於此。使用Kotlin同時能夠用於其餘平臺的開發。因此市面上以前說Kotlin是一款基於JVM的語言是不許確的。

 

 

Kotlin用於服務端開發:

使用Kotlin可用於Java服務端開發。Java與Kotlin的相互兼容性,咱們可以使用服務端的任意框架,同時咱們能夠保留老的Java代碼,使用Kotlin編寫新代碼。Kotlin的協程特性更有助於構建服務端程序。IDE的支持和Sring框架的支持。

 

Kotlin用於Android開發:

Android Studio的支持。大量的實際案列。大量可學習的APP項目。與Java兼容性容許在 Kotlin 應用程序中使用全部現有的 Android 庫。

 

Kotlin用於JavaScript:

使用kotlinc-js編譯器將Kotlin代碼轉換爲JavaScript(不是Kotlin或標準庫的代碼編譯時會被忽略),Kotlin中提供了一些標準庫用於JS開發,同時可使用第三方JS庫。

 

Kotlin Native:

Kotlin/Native 是一種將 Kotlin 編譯爲沒有任何虛擬機的原生二進制文件的技術。還在開發中,如今只出了預覽版本。

 

預覽版本支持: Window 、 Mac 、 IOS 、 Android等平臺。Kotlin代碼最終會編譯成一個kexe文件,直接打開就能夠運行。

 

基於Kotlin/Native的一款遊戲源碼:https://github.com/jetbrains/kotlinconf-spinner

 

2、開發多平臺項目

Kotlin 多平臺項目容許你將相同的代碼編譯到多個目標平臺。 目前支持的目標平臺爲 JVM 與 JS,即將增長 Native。

 

目前仍是1.2新版本的一個實驗性功能。

 

 

 

多平臺項目由三種類型的模塊組成:

● 公共模塊

公用模塊只包含與平臺無關的Kotlin代碼以及Kotlin公共標準庫代碼。同時還包含不含實現的平臺接口聲明。

 

● 平臺模塊

平臺模塊能夠依賴在指定平臺上可用的任何模塊與庫 (包括對於 Kotlin/JVM 平臺的 Java 庫與 Kotlin/JS 平臺的 JS 庫)。

 

● 經常使用模塊

與平臺模塊相互依賴的模塊

 

我對Kotlin的見解

一、確實是一門很優秀的語言。語言簡潔,包含各類語言的優秀特性。可是一些亮點的特性包含協程和多平臺都處於試驗和開發階段。並不能吸引除Java,Android以外的更多開發者加入(JS平臺使用的人並很少)。

 

二、與Java的交互性,讓它可以依賴Java成長。可是對Java的依賴和兼容性註定沒法徹底替換Java。

 

三、雖然得到Google承認,可是Kotlin語言的熱度一直在逐漸降低,發文以前在TIOBE排行榜已經降至49位。我猜想雖然Kotlin得到經驗豐富的程序員的青睞,可是對於初中級選手來講他們更願選擇Java這門熟悉的語言。

 

四、潛力是巨大的,畢竟有Google的官方支持和JetBrains的強勁實力作支撐。若是以後Kotlin在多平臺等實驗室特性上有所突破的話,絕對會吸引更多的開發者。

 

學習資料彙總

1.Kotlin官網

http://kotlinlang.org/

 

2.kotlin中文官網

https://www.kotlincn.net/

 

3.Google Kotlin項目學習實例

https://developer.android.com/samples/index.html?language=kotlin

 

4.阿里巴巴工程師教學系列文章

https://segmentfault.com/u/donghaichenguangjian

 

5.Kotlin協程

https://www.jianshu.com/p/9f720b9ccdea

https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md

https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md

 

6.其餘文章

https://blog.csdn.net/u013448469/article/details/79403284 Kotlin反射

https://blog.csdn.net/ztguang/article/details/72511994 Kotlin Native


騰訊WeTest自動化兼容測試提供雲端自動化兼容服務,提交雲端百臺真機,並行測試。快速發現遊戲/應用兼容性和性能問題,覆蓋安卓主流機型。目前已經支持全部騰訊在研和運營的手遊項目。

歡迎點擊連接:http://wetest.qq.com/product/auto-compatibility-testing 使用專家兼容測試服務。WeTest兼容性測試團隊期待與您交流!You Create,We Test!

騰訊WeTest有獎徵文活動進行中,歡迎投稿!瞭解詳情:http://wetest.qq.com/lab/view/379.html

相關文章
相關標籤/搜索