為什麼要使用Kotlin 對比 Java,Kotlin簡介

語言: CN / TW / HK

highlight: androidstudio

什麼是Kotlin

開啟Kotlin程式語言的官網,裡面大大的寫著,

A modern programming languagethat makes developers happier.

是一門讓程式設計師寫程式碼時更有幸福感的現代語言

  • Kotlin語法糖非常多,可以寫出更為簡潔的程式碼,便於閱讀。
  • Kotlin提供了空安全的支援,可以的讓程式更為穩定。
  • Kotlin提供了協程支援,讓非同步任務處理起來更為方便。
  • Google:Kotlin-first,優先支援kotlin,使用kotlin可以使用更多輪子

接下來對比Java舉一些例子。

簡潔

當定義一個網路請求的資料類時

Java

java public class JPerson { private String name; private int age; //getter //setter //hashcode //copy //equals //toString }

Kotlin

kotlin data class KPerson(val name: String,val age: Int)

這裡用的是Kotlin 的data class 在class 前面加上data修飾後,kotlin會自動為我們生成上述Java類註釋掉的部分

當我們想從List中篩掉某些我們不想要的元素時

Java

```Java List list = new ArrayList<>();

List result = new ArrayList<>(); for (Integer integer : list) {
if (integer > 0) { //只要值>0的
result.add(integer);
}
}

System.out.println(result);
```

Kotlin

```kotlin val list: List = ArrayList()

println(list.filter { it > 0 }) ```

如上程式碼,都能達到篩選List中 值>0 的元素的效果。

這裡的filter是Kotlin提供的一個拓展函式,拓展函式顧名思義就是拓展原來類中沒有的函式,當然我們也可以自定義自己的拓展函式。

當我們想寫一個單例類時

Java

```kotlin public class PersonInJava { public static String name = "Jayce"; public static int age = 10;

private PersonInJava() {
}
private static PersonInJava instance;
static {
    instance = new PersonInJava();
}
public static PersonInJava getInstance() {
    return instance;
}

} ```

Kotlin

kotlin object PersonInKotlin { val name: String = "Jayce" val age: Int = 10 }

是的,只需要把class換成object就可以了,兩者的效果一樣。

還有很多很多,就不一一舉例了,接下來看看安全。

安全

空安全

```kotlin var name: String = "Jayce" //name的定義是一個非空的String name = null //將name賦值為null,IDE會報錯,編譯不能通過,因為name是非空的String

var name: String? = "Jayce" //String後面接"?"說明是一個可空的String name.length //直接使用會報錯,需要提前判空 //(當然,Kotlin為我們提供了很多語法糖,我們可以很方便的進行判空) ```

型別轉換安全

kotlin fun gotoSleep(obj: Any) { if (obj is PersonInKotlin) {//判斷obj是不是PersonInKotlin obj.sleep() // 在if的obj已經被認為是PersonInKotlin型別,所以可以直接呼叫他的函式,呼叫前不需要型別轉換 } }

協程

這裡只是簡單的舉個例子

Kotlin的協程不是傳統意義上那個可以提高併發效能的協程式

官方的對其定義是這樣的

  • 協程是一種併發設計模式,您可以在Android平臺上使用它來簡化非同步執行的程式碼
  • 程式的邏輯可以在協程中順序地表達,而底層庫會為我們解決其非同步性。

當我們用Java請求網路資料時,一般是這麼寫的。

```Java getPerson(new Callback() {//這裡有一個回撥
@Override
public void success(Person person) {
runOnUiThread(new Runnable() { //切換執行緒
@Override
public void run() {
updateUi(person)
}
})
}

 @Override                                  
 public void failure(Exception e) {         
     ...                                    
 }

});
```

Kotlin協程後我們只需要這麼寫

kotlin CoroutineScope(Dispatchers.Main).launch { //啟動一個協程 val person = withContext(Dispatchers.IO) {//切換IO執行緒 getPerson() //請求網路 } updateUi(person)//主執行緒更新UI }

他們兩個都乾的同一件事,最明顯的區別就是,程式碼更為簡潔了,如果在回撥裡面套回撥的話回更加明顯,用Java的傳統寫法就會造成人們所說的CallBack Hell。

除此之外協程還有如下優點

  • 輕量
  • 更少的記憶體洩漏
  • 內建取消操作
  • 集成了Jatpack

這裡就不繼續深入了,有興趣的同學可以參考其他文章。

Kotlin-first

在Google I/O 2019的時候,谷歌已經宣佈Kotlin-first,建議Android開發將Kotlin作為第一開發語言。

為什麼呢,總結就是因為Kotlin簡潔、安全、相容Java、還有協程。

至於有沒有其他原因,我也不知道。(手動狗頭)

Google將為更多的投入到Kotlin中來,比如

  • 為Kotlin提供特定的APIs (KTX, 攜程, 等)

  • 提供Kotlin的線上練習

  • 示例程式碼優先支援Kotlin

  • Jetpack Compose,這個是用Kotlin開發的,沒得選。。。。。

  • 跨平臺開發,用Kotlin實現跨平臺開發。


好的Kotlin就先介紹到這裡,感興趣的同學就快學起來吧~ 接下來在其他文章會對Kotlin和攜程進行詳細的介紹。

df7da83ea7648fdeb9963e9552ba2425.gif