search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

Kotlin 使用的一些心得


一周前開始學習kotlin,現在已經在項目中開發使用了。我目前負責的項目老代碼非常多,之前的java代碼已經有十多萬行了。所以即便使用了kotlin,也只是在新建文件的代碼里使用,老代碼繼續用java。kotlin的好處就是完全兼容java,java調用kotlin,kotlin基本上無阻礙。

先說說為什麼要轉kotlin

  • Google已經明確kotlin為第一官方語言。我相信Google的決意,就像當初毫不猶豫的拋棄eclipse轉向as。kotlin已經是不可避免的大勢所趨了。

    Kotlin與java代碼完全兼容。使用kotlin就好像只是增加了一個庫。打個比方,Rxjava比較難上手吧,不懂Rxjava的人看Rxjava像看天書,更不知從何寫起。kotlin學起來比Rxjava簡單的多。

    作為一名程序猿,我是非常追求代碼的簡潔高效。在代碼簡潔上,kotlin簡直是神器,太和我心意了。由於要兼容低版本,之前就一直在用java的lambda表達式插件,但是很多java8的特性還是用不了。kotlin全部能做到,而且更好。在易理解的基礎上,能用1行代碼搞定的事我絕不會寫兩行。用了kotlin,我自己寫的很多基礎函數都用不著了。真正的Enjoy Coding!

也說一下目前遇到的一些問題

  • 由於集成了kotlin包,apk會增大約0.5M。這看你的項目是否能接受了,我覺得還行。

    目前沒發現什麼大坑。在java-kotlin互相調用時要小心,koltin如果不註明,是強制不為空的。如果你的java代碼有良好的習慣,出入參都註明了@Nullable @Nonnull,就沒什麼問題了

安裝與配置

參考kotlin官網

我的android studio 沒有升級3.0預覽版,使用的還是2.3版本。

  • 首先更新kotlin語言插件

工程里添加如下插件配置

然後是依賴路徑

最後是編譯依賴的倉庫,用著這個就行了。

注意幾點:

  • 如果之前使用了依賴於註解的庫如Dragger,databinding等,需要額外的配置,詳情請參考官網

  • Anko 是一個封裝了很多android操作的庫,比如ui操作、非同步操作、資料庫操作等等。不過我目前覺得還用不著,就沒加。感興趣的同學可以自己去添加。

ok, 可以進入kotlin世界了!

我主要是參考了這本書 《Kotlin for Android developers》 ,加上一些自己的理解。內容不多,看幾遍就記得差不多了。剛學習kotlin時可以下載下來,使用時隨時查閱。

Koltin的類

kotlin的變數申明 val 是不可變變數,相當於java里的final。var是可變變數,一般情況盡量使用val 。如果使用var一般都需要判空

這裡有個小坑,如果沒加?傳入了空參數是,kotlin會強制判空拋異常。

只要是Java語言有交互的參數,除非是100%確定不為空,否則請務必都加上安全操作符?。

類繼承

添加其他構造函數

另外,kotlin不需要new操作符了,創建類直接調用其構造方法,就像使用普通函數那樣。

val view = CustomView(context, attrs)

Kotlin的方法

方法申明差不多,動手寫一下很快就明白了。

默認參數特別好用! 終於可以不用寫一大堆同名函數了

動態方法擴展相當於將一大堆Util換種寫法

比如非同步載入圖片的封裝,java這樣寫

kotlin這樣寫:

注意一點

在java里,所有的方法都要在聲明在類里,一般一個類也只能有一個pulic方法。kotlin的方法可以獨立放在類外面,左右全局使用,比如前面提到ImageView擴展方法就要單獨放在類外部。kotlin一個文件可以申明多個全局方法,聲明多個public類。就是說,很多東西都能放在kotlin一個文件里。

Koltin的Null處理

使用安全操作符?可以省略很多無意義判空操作

不多說,直接上代碼,一看就都明白了。

以前這樣寫

現在這樣寫

靜態常量,靜態函數,單例

如果一個類里都是靜態常量和靜態函數,直接在最外面寫

如果是在普通類里有靜態變數,以及單例,這樣寫

這樣調用

kotlin的inline(內聯)函數

內聯函數與一般的函數不同,在編譯時會做替換,少了普通函數調用的壓棧出棧,更高效。因為是替換,所以可以識別傳入的泛型

比如

直接這樣調用

可以傳入代碼塊,比如一個非同步線程操作的代碼塊

Kotlin基礎庫里大量的便捷操作以及Anko庫里很多操作都是使用inline函數完成的。常用的when, apply, let,以及對list數組封裝的各種操作firstOrNull,filter等都是內聯函數完成的。

Koltin函數需要傳入的代碼塊可以直接放在函數名的大括弧里,不需要再用小擴號包起來。這樣的話,很多調用就非常簡潔

比如Anko庫里的async, uiThread ,非同步操作的寫法比Rxjava簡單的多!

而且其寫法很巧妙,只保存了外部Activity的弱引用,如果在非同步執行過程中Activity銷毀了uiThread則不會調用,防止內存泄漏。

FindViewById

由於有了插件kotlin-android-extensions.

Activity里可以這樣寫,不需要在額外申明TextView變數了。所以注意xml文件里id的命名使用駝峰寫法

Adapter里這樣寫, ViewHolder完全不需要了

其他

注意在kotlin中== 相當於java中的equal函數,=== 相當於java中的==。不過一般情況加==就夠了。kotlin中沒有基本類型,所有的如Int,Long都是對象。

kotlin中沒有三元操作符。可以用if else,或者 ?:代替。

java:

kotlin:

?:表示先判斷前面是否為空,為空的話就返回後面的

因為都是基於JVM,Kotlin的所有操作java當然都能做到,但是kotlin更簡潔容易理解!





熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦