1. 程式人生 > >一句話解決的事何必說三句,Kotlin入坑指南

一句話解決的事何必說三句,Kotlin入坑指南

看到這個標題你可能覺得很奇怪,其實這裡指的是Kotlin語言出色的簡潔性,能比原有用Java程式碼實現的功能縮小三倍以上的程式碼量。不僅如此,這還不是Kotlin最出色的語言特性,不信你接著往下看。

什麼是Kotlin?

Kotlin是JetBrains開發的基於JVM的語言。JetBrains是一家捷克的軟體開發公司,該公司位於捷克的布拉格,研發了IntelliJ IDEA這款相對於Eclipse有較大改善的大名鼎鼎IDE產品,使用Java開發的童鞋想必也是非常瞭解了,還有一些其他類似產品比如,Pycharm,Clion等等,我就不打廣告了[捂臉]

而Android Studio這款官方的Android開發IDE也是基於IntelliJ開發出來的。而在今年的Google I/O大會上,Google官方承認了Kotlin作為Android開發的官方語言,所以說JetBrains與Google想必是有什麼不可告人的祕密,咳咳。

我們為什麼要學Kotlin?

下面來講一下Kotlin和Java相比的優勢是什麼?

  • 更簡潔:這是它重要的優點之一,可以比Java編寫少得多的程式碼。
  • 更安全:Kotlin是空安全的,它在編譯期間就會處理各種為null的情況,無需像java一樣新增很多的判空程式碼,節約很多除錯空指標異常的時間,很大程度上避免出現NullPointException。

  • 易擴充套件:擴充套件函式意味著我們不僅可以擴充套件我們原有寫好的類,還可以擴充套件系統級的類,非常靈活,另外如果在類裡編寫擴充套件函式,那麼只對當前類生效。

  • 函式式:Kotlin使用了很多函數語言程式設計的概念,比如用到了lambda表示式來更方便地解決問題。
  • Kotlin Android Extensions:再也不用編寫煩人的findViewById()了,如果你集成了ButterKnife,是時候刪除對它的依賴了,Kotlin支援了對於View以id形式訪問。

  • 不用寫分號,就像你看到的上述程式碼一樣,對於很多寫過指令碼語言的童鞋來說,不要寫分號這一點真是節省了很多時間,對於一天寫幾百行幾千行甚至上萬行程式碼的童鞋們來說,相當於省了多少個分號。

到這裡有的同學想要說了,你說的這些好處確實不錯,但是我之前的專案全是用java語言來寫的,難不成讓我推倒重來過?別急,最後我要說的一個最大的優勢就是

  • 與Java語言可混合程式設計,也就是說我們可以繼續使用原來所有用Java寫的程式碼和庫,因為兩個語言之間高度互操作,想嘗試的童鞋們建議可以從新的小功能小模組入手,對這些模組使用Kotlin程式碼進行編寫,原有的穩定模組之後再逐步重構。
  • 對初學者友好,kotlin對java語言轉用kotlin提供了很多便利,對於初學者來說免去很多不必要的煩惱。最貼心的是Kotlin外掛支援一鍵由Java轉Kotlin,為你之後想要重構提供了很大的便利性。

簡潔性

我們以最基本的POJO為例

public class User {
private long id;
private String name;
public void setId(long id) {
this. id = id;
}
public void setName(String name) {
this. name=name;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
}

其實上述類裡就兩個欄位,一個id一個name,如果拿kotlin來寫的話是什麼樣子呢?

data class User(var name: String, var id: String)

這一句程式碼就夠了,Kotlin會自動生成所有屬性和它們的訪問器,以及一些方法,例如toString方法及equals方法。

var user = User("kotlin","123")

另外如果不需要引數或者只需要一個引數時

class User {
var name: String? = null
var id: String? = null

constructor(name: String) {
this.name = name
}

constructor(name: String, id: String) {
this.name = name
this.id = id
}
}

空安全

可能有的童鞋會問了,?= 是個shenmegui??

當我們用Java寫程式碼時,我們如果不想出現NullPointerException,我們需要在使用它之前每次去判斷是否為空。而Kotlin這類空安全語言預設物件和欄位不能為空,如果我們非要讓一個欄位或物件為空那麼必須使用安全呼叫操作符(?)來指定。

val user: User? = null
toast(user.name)

例如以上程式碼,是無法編譯通過的,因為user是可能為空的,而user沒對空情況做處理,所以無法編譯。解決方式有兩種:

//第一種對欄位進行空情況做處理,則可安全呼叫
if(user != null){
    toast(user.name)
}
//第二種利用安全呼叫操作符,只有在user不為空時會呼叫user.name,否則呼叫toast(null)
toast (user?.name

我們也可以給它賦一個預設值,當user為空時呼叫toast(“kotlin”)

//Elvis操作符用法
toast(user?.name ?: "kotlin")

易擴充套件

上述程式碼有的人會問了,為什麼你的toast可以這麼寫?其實就是kotlin的擴充套件函式在起作用。

kotlin允許我們對任何類新增方法,包括系統級的類,自定義類等等,比如我想在Context類中新增一個toast方法。
我們新建一個kt檔案(kotlin的檔案字尾),在裡面寫上

fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { 
    Toast.makeText(this, message, duration).show()
}

加上這句之後,你可以在所有用到context的地方呼叫context.toast()方法,另外如果擴充套件方法寫到類中,那麼僅在該類生效。

這是個很有意思的特性,接下來的事情就是發揮你們的想象力了~

函式式(Lambdas)

舉個栗子,我們在Android開發中,經常需要寫的點選事件

view.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        Toast.makeText(v.getContext(), "Click", Toast.LENGTH_SHORT).show();
    }
})

利用了之前提到的擴充套件函式,可以寫成

view.setOnClickListener(object : OnClickListener {
    override fun onClick(v: View) {
        toast("Click")
    }
}

利用lambdas表示式我們可以把上述程式碼優化

view.setOnClickListener({view -> toast("Click")}}

很多情況下我們並不需要用到引數View,所以左值引數也可以省略

view.setOnClickListener({toast("Click")}}

由於這個方法只有一個引數,我們可以省略這個圓括號:

view.setOnClickListener{toast("Click")}

比原來的java程式碼簡短了5倍,並且也很容易理解。

Kotlin Android Extention

舉個栗子,在Android中我們不可避免地要寫以下這種程式碼

TextView textView = findViewById(R.id.textview);
Button button = findViewById(R.id.button);

textView.setText("kotlin");
button.setOnClickListener(...)

或者利用ButterKnife,寫如下程式碼

@Bind(R.id.textview)
TextView mTextView;

@Bind(R.id.button)
Button mButton;

...

mTextView.setText("kotlin");

mButton.setOnClickListener(...)

相信不止我一個人覺得這種程式碼又重複又無聊,kotlin給我們提供了另外一個思路,直接利用id來繫結

// 匯入該Activity對應的佈局檔案
import kotlinx.android.synthetic.main.activity_main.*

...
    //匯入後,整個Activity就可以直接利用id來對View進行操作了
    // Instead of findView(R.id.textView) as TextView
    textView.setText("kotlin")
    // Instead of findView(R.id.button) as Button
    button.setOnClickListener(...)
    }
}

這樣處理再也沒有一點多餘程式碼,直接利用view的id操作,簡潔明瞭。

匯入格式:import kotlinx.android.synthetic.main..*

對初學者友好

我們在由一門語言轉到另一門語言時難免有所抵觸,會考慮新的語言學習成本等等問題。不過對於Kotlin來說,給了掌握Java語言童鞋們轉Kotlin很多便利性:

  • 在java中編寫一段程式碼,貼上到kotlin檔案中,IDE利用黑科技將貼上的java程式碼自動轉換成kotlin。

  • 對於之前已經編寫好的java類,我們重構不知何從下手時,kotlin提供一鍵轉換功能

在idea中安裝kotlin外掛之後,我們可以在Code下找到

總結

本文淺顯地總結了下kotlin對比java的幾個優勢,對於深層次的解析會放在後面的文章,有興趣的童鞋可以繼續關注,畢竟一門語言博大精深也不是一篇文章能講完的。相信你看到這裡內心早就想體驗一下kotlin的魅力了,點此開啟你的kotlin之旅吧。

參考文獻

  1. Kotlin 官方文件
  2. 《Kotlin for android Developers》