Android平台的Swift—Kotlin


WeTest 導讀

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

 


 

什么是kotlin?

一、一門靜態編程語言

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

 

二、JetBrians開發設計

一家捷克的軟件公司,是著名的IDE開發商,對很多的開發語言和平台都提供了相應的集成開發環境,比如Java的,OC的,JavaScript,PHP,C/C++等。而其中最著名的是IntelliJ IDEA ,Java的集成開發環境,被稱為目前最好用的java IDE。而且Android Studio就是Google基於IntelliJ IDEA 開發的,由此可見Google和JetBrains的合作也是比較密切的。而從以上說明也可以看到JetBrains不僅實力強勁,這家公司對於語言設計更是有天然優勢。Kotlin是集多家語言之大成。

 

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

我們在GitHub上可以下載Kotlin的全部源代碼。而且可以自己進行代碼修改,再發布。

 

https://github.com/JetBrains/kotlin 

 最新版本已經更新到了1.2.3 。

 

四、Android官方開發語言

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

被程序員們稱為Android平台的Swift。

 

Kotlin有哪些優勢?

一、 語法簡潔,且吸收了很多其他語言的優點

 

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

 

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

 

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

 

 

二、安全性

 

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

 

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

 

三、完全兼容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。

 

四、工具支持

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的包裝類(基礎類型包裝成對象)。

 

2、定義函數

 

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

 

同時我們可以在定義函數的時候聲明參數的默認值。

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

 

使用命名參數可以增加可讀性,減少函數的重載。

 

 

3、類的聲明

 

 

類名的冒號表示繼承,所有類的基類稱為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循環,同時增加了區間控制

 

5、集合

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

 

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

 

訪問:

 

6、伴生對象

Kotlin中沒有靜態屬性和方法。如果我們要創建單列,可以使用Object關鍵字聲明類

 

如果要在一個類里面聲明靜態成員,可以在類的內部使用伴生對象。使用關鍵字companion object

 

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

 

二、新特性

1、空安全

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

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

 

非空引用:

 

可空引用:

 

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

 

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

 

2、擴展函數

跟OC的Category一樣,可以對API的函數進行擴展。

 

我們在任意Activity中都可以直接調用

 

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

 

3、字符串模板

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

 

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

 

4、操作符重載

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

 

 

示例:

 

 

調用:

 

5、Lambda表達式

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

 

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

 

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

 

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

 

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

 

調用:

 

在Android中使用Lambda表達式,可以寫成

 

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

 

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

 

三、高級特性

1、高階函數

把函數作為參數或者是返回值的函數,Kotlin稱之為高階函數。比如函數:

 

 

就是一個高階函數。可以這么調用:

 

我們聲明一個局部函數,然后把他作為參數傳遞給另一個函數。我們還可以使用Lambda表達式來表示函數參數。

 

2、泛型

泛型的存在主要是為了消除模板代碼和類型轉換安全, 在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

 

3、反射

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

1)Kotlin中使用Java的反射

 

jc返回的是Java的class對象,可以通過這個對象去調用調用Java的反射。

 

2)Kotlin中的反射:

 

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

 

4、協程

什么是協程?

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

 

程序使用協程可以書寫線性的異步代碼,沒有callback,大大簡化了異步編程。線程有的異步操作協程都支持,協程的掛起和切換非常輕量基本沒有開銷。

 

如何使用協程?

 

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

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

 

kotlin跨平台

一、多平台支持

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

 

二、開發多平台項目

Kotlin 多平台項目允許你將相同的代碼編譯到多個目標平台。 目前支持的目標平台為 JVM 與 JS,即將增加 Native。

 

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

 

 

 

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

● 公共模塊

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

 

● 平台模塊

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

 

● 常用模塊

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

 

我對Kotlin的看法

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

 

2、與Java的交互性,讓它能夠依賴Java成長。但是對Java的依賴和兼容性注定無法完全替換Java。

 

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

 

4、潛力是巨大的,畢竟有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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM