
android開發者在語言限制方面面臨着一個困境。衆所周知,目前的android開發隻支援java 6(語言本身從java 7開始進行了一些改進),是以我們每天隻能使用一種古老的語言來進行開發,這極大地降低了我們的生産力,同時也迫使我們不得不編寫大量的樣闆與脆弱的代 碼,然而這樣的代碼是難以閱讀和維護的。幸運的是,android程式是運作在java虛拟機之上的,是以從技術上來說,可以運作在jvm之上的一切都可 用于開發android應用。現在已經有很多可以生成jvm能夠執行的位元組碼的語言,其中一些語言開始嶄露頭角并逐漸流行起來,kotlin就是其中的佼 佼者。
何為kotlin?
kotlin是一門運作在jvm之上的語言。它由jetbrains建立,而jetbrains則是諸多強大的工具(如知名的java ide intellij idea)背後的公司。kotlin是一門非常簡單的語言,其主要目标之一就是提供強大語言的同時又保持簡單且精簡的文法。其主要特性如下所示:
輕量級:這一點對于android來說非常重要。項目所需要的庫應該盡可能的小。android對于方法數量有嚴格的限制,kotlin隻額外增加了大約6000個方法。
互操作:kotlin可與java語言無縫通信。這意味着我們可以在kotlin代碼中使用任何已有的java庫;是以,即便這門語言還很年 輕,但卻已經可以使用成百上千的庫了。除此之外,kotlin代碼還可以為java代碼所用,這意味着我們可以使用這兩種語言來建構軟體。你可以使用 kotlin開發新特性,同時使用java實作代碼基的其他部分。
強類型:我們很少需要在代碼中指定類型,因為編譯器可以在絕大多數情況下推斷出變量或是函數傳回值的類型。這樣就能獲得兩個好處:簡潔與安全。
null安全:java最大的一個問題就是null。如果沒有對變量或是參數進行null判斷,那麼程式當中就有可能抛出大量的 nullpointerexception,然而在編碼時這些又是難以檢測到的。kotlin使用了顯式的null,這會強制我們在必要時進行null檢 查。
目前kotlin的版本是1.0.0 beta 3,不過正式版很快就會釋出。它完全可以用在生産當中,現在就已經有很多公司成功應用上了kotlin。
為何說kotlin非常适合于android?
基本上,這是因為kotlin的所有特性都非常适合于android生态圈。kotlin的庫非常小,我們在開發過程中不會引入額外的成本。其大小 相當于support-v4庫,我們在很多項目中所使用的庫都比kotlin大。除此之外,android studio(官方的android ide)是基于intellij建構的。這意味着我們的ide對該語言提供了非常棒的支援。我們可以很快就配置好項目,并且使用熟悉的ide進行開發。我 們可以繼續使用gradle以及ide所提供的各種運作與調試特性。這與使用java開發應用别無二緻。歸功于互操作性,我們可以在kotlin代碼中使 用android sdk而不會遇到任何問題。實際上,部分sdk使用起來會變得更加簡單,這是因為互操作性是非常智能的,比如說它可以将getters與setters映 射到kotlin屬性上,我們也可以以閉包的形式編寫監聽器。
如何在android開發中使用kotlin?
過程非常簡單,隻需按照下面的步驟來即可:
從ide plugins中下載下傳kotlin插件
在子產品中建立kotlin類
使用“configure kotlin in project…”
開始編碼
kotlin的一些特性
kotlin擁有大量非常打動人心的特性,這裡無法一一進行介紹,不過我們來看一下其中最為重要的一些。
null安全
如前所述,kotlin是null安全的。如果一個類型可能為null,那麼我們就需要在類型後面加上一個?。這樣,每次在使用該類型的變量時,我們都需要進行null檢查。比如說,如下代碼将無法編譯通過:
第2行會顯示一個錯誤,因為沒有對變量進行null檢查。我們可以這樣做:
這展示了kotlin另一個出色的特性:智能類型轉換。如果檢查了變量的類型,那就無需在檢查作用域中對其進行類型轉換。這樣,我們現在就可以在 if中将artist作為artist類型的變量了。這對于其他檢查也是适用的。還有一種更簡單的方式來檢查null,即在調用對象的函數前使用?。甚至 還可以通過elvis運算符?提供另外一種做法:
資料類
在java中,如果想要建立資料類或是pojo類(隻儲存了一些狀态的類),我們需要建立一個擁有大量字段、getters與setters的類,也許還要提供tostring與equals方法:
在kotlin中,上述代碼可以寫成下面這樣:
kotlin使用屬性而非字段。基本上,屬性就是字段加上其getter與setter。
互操作
kotlin提供了一些非常棒的互操作特性,這對于android開發幫助非常大。其中之一就是擁有單個方法的接口與lambda表達式之間的映射。這樣,下面這個單擊監聽器:
可以寫成這樣:
此外,getters與setters都會自動映射到屬性上。這并不會造成性能上的損失,因為位元組碼實際上隻是調用原來的getters與setters。如下代碼所示:
lambda表達式
lambda表達式會在極大程度上精簡代碼,不過重要的是借助于lambda表達式,我們可以做到之前無法實作或是實作起來非常麻煩的事情。借助于 lambda表達式,我們可以以一種更加函數式的方式來思考問題。lambda表達式其實就是一種指定類型,并且該類型定義了一個函數的方式。比如說,我 們可以像下面這樣定義一個變量:
該變量可以聲明一個函數,它接收一個view并傳回這個函數。我們需要通過閉包的方式來定義函數的行為:
上面這個函數會接收一個view,如果該view是textview的執行個體,那麼它就會傳回true。由于編譯器可以推斷出類型,是以我們無需指定。還可以更加明确一些:
借助于lambda表達式,我們可以抛棄回調接口的使用。隻需設定希望後面會被調用的函數即可:
asyncoperation(5) { result -> println("result: $result") }
還有一種更加簡潔的方式,如果函數隻接收一個參數,那就可以使用保留字it:
anko
anko是kotlin團隊開發的一個庫,旨在簡化android開發。其主要目标在于提供一個dsl,使用kotlin代碼來聲明視圖:
它還提供了其他一些很有用的特性。比如說,導航到其他activity:
總結
如你所見,kotlin在很多方面都簡化了android的開發工作。它會提升你的生産力,并且可以通過非常不同且更加簡單的方式來解決一些常見的問題。
====================================分割線================================