1. 程式人生 > >Kotlin學習!!!此帖有點火

Kotlin學習!!!此帖有點火

為什麼使用Kotlin

專案一期在收尾了終於有時間折騰了,一個多月以來Kotlin從入門到現在,堅持用來開發的切身感受。因為語法與Java的區別挺大的一開始很想放棄,如果不是因為專案在使用,想必很少人會嘗試這樣一門小眾語言,但是習慣後會發現這些年究竟浪費多少時間在寫無用的Java程式碼了,Kotlin在相容Java的基礎上還能大大提升開發效率。Kotlin有許多特性但對於開發來說,快速適應和學習更為重要,很多時候我們都是在不明白其原因就開始使用的,正如我們不可能把Retrofit原理研究透才使用它。只要它足夠穩定成熟,並能有效的提升開發效率都是值得嘗試的。鄙人不才,目前使用Kotlin的原因主要是因為它語法簡潔,支援lambda表示式,強大的when語法,不用寫分號結尾,光是這些就足以讓我喜歡Kotlin。至於空安全之類的特性,畢竟服務端資料型別太多null了並沒多大感觸,這些特性在實際應用中潛移默化的就吸收了,以至於現在遇到幾個Java編寫的程式碼,都有些不適應了。

萬能的冒號

在Kotlin中冒號:用萬能來稱呼絕不為過。常量變數的型別宣告,函式的返回值,類的繼承都需要它

//val表示常量var表示變數宣告
val name: String = "tutu" 
//省略型別說明
var age = "23"
//fun表示函式
fun getName(): String{
   return "tutu"
}
//類繼承
class UserList<E>(): ArrayList<E>() {
    //...
}

除此之外還有一個特別的地方也需要它,使用Java類的時候。Kotlin最終會還是編譯成Java位元組碼,使用到Java類是必然的,在Kotlin語法如下

val intent = Intent(this, MainActivity::class.java)

類名::class.java沒有為什麼就這麼寫記著就是

我是誰的@

除了冒號另一個重要符號@,想必用到內部類和匿名內部類的地方一定很多,再加上支援lambda語法,沒有它誰告訴你thisreturn指的是哪一個

class User {
    inner class State{
        fun getUser(): User{
            //返回User
            return this@User
        }
        fun
getState()
: State{ //返回State return this@State } } }

偷懶的方法

1). Kotlin特色
Java的getter/setter方法自動轉換成屬性,對應到Kotlin屬性的呼叫

public class User {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

這樣一個Java類在Kotlin中只需這樣呼叫

val user = User()
//賦值
user.name = "tutu"
user.age = "23"
//取值
val name = user.name
val age = user.age

反之Kotlin的屬性自動生成Java的getter/setter方法,方便在Java中呼叫,同樣的定義在Kotlin中

class User {
    var name: String? = null
    var age: String? = null
}

我們的getter/setter方法有時不會這麼簡單,這就需要自定義getter/setter了,另起一行設定get()/set(value)方法,實現一個Java中常用的單例,這裡只為了展示,單例在Kotlin有更簡單的方法實現,只要在 package 級別建立一個 object 即可

class User {
    companion object {
        @Volatile var instance: User? = null
            get() {
                if (field == null) {
                    synchronized(User::class.java) {
                        if (field == null)
                            field = User()
                    }
                }
                return field
            }
    }

    var name: String? = null
    var age: String? = null
}

自定義getter/setter重點在field,跟我們熟悉所Java的this指代當前類一樣,field指代當前引數,直接使用引數名instance代替不會報錯但單例就沒效果了

2). 字串模板
在Java中拼接字串的程式碼可讀性都很差,在Kotlin字串拼接變得非常簡潔,只需用$後面加上引數名,複雜的引數要加上{}

val user = User()
//賦值
user.name = "tutu"
user.age = "23"
//取值
val name = user.name
val age = user.age
var userInfo = "name:${user.name},  age:$age"
//輸出結果:name:tutu, age:23

3). lambda
一開始覺得lambda很高階完全看不懂,其實很簡單的就是把介面名、方法名和引數型別省掉不寫再加個->罷了,明白這點了就不介紹。

新面孔

1). 延遲載入
2). 流程控制
內容上一篇寫過參考 Android Kotlin 學習筆記,不重複介紹

空判斷

Kotlin的空安全設計對於宣告可為空的引數,在使用時要進行空判斷處理,有兩種處理方式一種像Java一樣丟擲空異常,欄位後加!!,另一種不做處理直接跳過,欄位後加?

//型別後面加?表示可為空
var age: String? = "23" 
//丟擲空指標異常
val ageInt = age!!.toInt()
//不做處理跳過
val ages = age?.toInt()

注意事項

內部類和引數預設為public,而在Java中為private
類預設為不可繼承(final),想要可被繼承要宣告為openabstract
取消了static關鍵字,靜態方法和引數統一寫在companion object
internal模組內可見,inner內部類

以上僅是對使用頻率較高的語法總結,學會基本可以閱讀Kotlin程式碼,遇到點問題Google速查一下,至於智慧轉換、型別推導之類的不用說使用後喜歡自然就會了。當然這只是kotlin的基本語法,方便Java快速熟悉kotlin,深入學習還請閱讀相關資料。

相關連結

線上學習
Kotlin 官方文件
Kotlin 中文文件
Kotlin 中文文件 這個感覺像官網的中文版,翻譯質量很好,不過左側的分類沒法點選,不知是不是瀏覽器問題,我就一個個羅列出來了
入門
基礎
類和物件
函式和lambda表示式
其他
文件
互操作
FAQ
最終找到了翻譯出處kotlin-web-site-cn
http://tanfujun.com/kotlin-web-site-cn/