來自:麻辣軟硬體(微訊號ID:VOSDeveloper)
我最近更新了Android開發工具Android Studio,版本為3.4RC2,發現預設的開發語言已經改為kotlin,而不再預設是java了,該來的終於要來了。
本人沒有使用過Kotlin,初步瞭解了Kotlin後,這門語言讓我聯想到金庸武俠裡邊的武學奇才鳩摩智!親自嘗試使用其編寫程式碼後,卻又感嘆Kotlin是真正站在老前輩java肩膀上的新生代高手。一起來瞭解下Kotlin吧!
一、Kotlin介紹
Kotlin的歷史
-
2010 年: JetBrains 著手開發 Kotlin。
-
2011 年: JetBrains 公開宣佈 Kotlin。
-
2012 年: JetBrains 在 Apache 2 許可證下開源了 Kotlin。
-
2016 年: JetBrains 釋出了 Kotlin 1.0 版,是比較穩定的正式版。
-
2017 年: Google IO大會宣佈使用Kotlin作為Android的官方開發語言。
-
2019 年: Kotlin替代java,成為Android Studio中預設開發語言。
Kotlin名稱的由來
Kotlin的命名來源於一個俄羅斯的島嶼的名字,全稱是 Kotlin Island —–科特林島。為啥叫Kotlin呢?因為Kotlin是捷克著名的IDE廠商JetBrains開發的語言,而其在俄羅斯設有分公司,其名稱應該就是其俄羅斯分公司給起的。
Kotlin語言的設計標的
-
建立一種相容Java的語言
-
讓它比Java更安全,能夠靜態檢測常見的陷阱。如:取用空指標
-
讓它比Java更簡潔,透過支援variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation等實現。
-
讓它比最成熟的競爭對手Scala語言更加簡單。
二、Kotlin的武功技能
Kotlin的初衷是取代Java成為更安全更簡便的開發語言,但是隨著版本的更新,Kotlin的胃口和野心也越來越大,取代Java只是其技能中的一項,還打起了Javascript和C/C++的主意。
下麵說明一下Kotlin各項主要技能
1、對Java保持100%的相容
-
Kotlin程式碼編譯後,可以生成Jvm位元組碼。
-
Kotlin生成的位元組碼,打包為庫檔案(jar包),Java可以直接呼叫。
-
Kotlin可以直接呼叫現有的Java程式碼。
基於以上幾點,開發者可以毫無後顧之憂地轉向Kotlin。
2、可以編譯生成javascript代
Java目前是擁有開發者數量最多的熱門語言,成為Kotlin的獵物;目前Web端開發的熱門語言javascript也開發者眾多,隨著Node.js這樣的語言出現後,javascript可以用來寫服務端程式碼,開發者增加得很快,同樣也成為Kotlin的獵物。
目前Kotlin編譯後,直接生成javascript程式碼,也就是你學了Kotlin之後,相當於擁有量java和javascript兩項技能,你學不學?
3、可以生成本地機器指令,與C/C++互動
與C/C++的互動,這可以理解,因為Java程式設計就帶有Jni呼叫C/C++庫的場景。Kotlin既然是100%的相容java,呼叫C/C++庫自然是支援的。
Kotlin支援生成本地機器指令,這個就有點牛X了!Kotlin這是要完全跳出Jvm的束縛,野心不小啊。
除了上面提到的呼叫C/C++庫,開發者還可以用Kotlin編寫二進位制庫檔案,生成.h檔案並提供給C/C++開發者呼叫。Kotlin的這個技能,把我嚇了一跳!大家都知道, C/C++語言學習的困難程度相比其他程式語言要高一些,如果c++和c能寫的,Kotlin也能完成同樣同質量的(效能、程式的體積),誰還願意用C/C++呢?
想象一下,核心驅動可以用kotlin寫,甚至linux內核可以用Kotlin寫,多美好!
我親自在windows上測試了一下Kotlin Native,一個HelloWorld程式體積非常小,只有622KByte,相比go語言的幾M來說已經很小了,目前我尚不清楚它是否還有類似於c語言的libc.so這樣的依賴。
目前的Kotlin應該還沒到達完全能替代C/C++這個程度,這部分技能還不是Kotlin練的最爐火純青的,但是它開啟了人們對未來的憧憬!
說到這裡,學一個Kotlin語言,你可以擁有Java, C, C++, JavaScript的能力,你心不心動? Kotlin像不像精通多種武學的鳩摩智?
三、Kotlin憑啥取代Java成為Android開發第一語言
Java的擁有者–甲骨文公司,今年來對谷歌侵犯其Java版權的訴訟,可能是谷歌決心替換Java的一個因素。然而Kotlin並非僅僅是從語法上再造一個Java,而是確實吸取Java的優點,彌補了Java中一些讓人詬病的缺陷,並加入了Java中沒有的新語言特性。
Kotlin比Java的語法更簡潔
近幾年出現的火起來的新語言都有兩個特點,一是讓開發人員少寫程式碼;二是語言比較容易上手。
Keepsafe公司的App Lock將Java程式碼全部轉換成kotlin後原始碼行數減少 30%、方法數減少 10%。
優秀的開發工具支援
Kotlin屬於如今首屈一指的JetBrains,其開發的IntelliJ IDEA火得一塌糊塗,谷歌也基於IntelliJ IDEA開發了Android Studio,是Android應用開發者每天都在使用的開發工具。
在Android Studio中,可以直接自動將java程式碼轉換成Kotlin程式碼。
官方為簡化Android開發,為Android Studio提供了kotlin-android 擴充套件外掛。有了這個擴充套件工具,開發人員可以和findViewById說再見了。
下麵對比下java的實現和加上了kotlin-android外掛的kotlin程式碼實現的對比:
Java版本:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//煩人的findViewById,煩人的型別轉換!
TextView tv = (TextView) findViewById(R.id.text1);
Botton btn = (Botton ) findViewById(R.id.btn1);
//java的方法呼叫
tv.setText("Hello");
//寫法比Kotlin複雜一點
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
btn.setText("Haha");
}
});
}
}
Kotlin版本:
//class預設public的可以省略不寫
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//沒有findViewById,沒有型別轉換
//layout裡的id直接拿來用就行
text1.text="Hello"
//設定監聽器也比java簡單得多
btn.setOnClickListener {
btn.text = "Haha"
}
}
}
其他優秀的語言特性
Kotlin的語言特性,還有好些個,我們挑一些最受開發者歡迎的來簡單介紹一下。
1、Null Safety (空型別安全)
這來源於java中的NullPointerException, 所有Java開發者最討厭的一個東西,Kotlin從這裡入手,明智之舉!
//這就是讓程式員討厭的非空檢查
if (var != null) {
var.xxx();
}
這種非空檢查在android7.1系統的framework中大概有一萬九千個! google大神寫的程式碼尚且如此,可想而知普通開發者寫的有多少個,有多痛恨這空指標異常,多討厭這種無聊的非空檢查。
在kotlin中,直接設定了可為null和不可為null兩種型別:
//不可為null物件
var nonNullVar : String = ""
//可為null物件
var mayBeNullVar : String? = null
//如果程式員將不可控物件設定成null
//編譯器直接報錯
nonNullVar = null
有了這兩種物件,kotlin還更進一步對null進行處理
//不可空物件,無需擔心空指標
nonNullVar.xxxx()
//可空物件沒有檢查是否非空前
//直接使用,編譯器會報錯
mayBeNullVar.xxxx()
//如果不為空則執行
//比java舒服多了
mayBeNullVar?.xxxx()
//還有kotlin的Elvis運運算元?:
var m = b?.length ?: -
2、Extension functions(擴充套件功能)
擴充套件函式也就是說,已經存在的一個類,我們不需要修改這個類的程式碼,可以給他增加一個方法或者一個屬性。這個我第一次聽說,好像很玄乎,我們用實際程式碼來說明:
//下麵程式碼為 MutableList 新增一個 swap 方法:
fun MutableList.swap(index1: Int, index2: Int) {
val tmp = this[index1] // “this”對應該串列
this[index1] = this[index2]
this[index2] = tmp
}
//使用這個擴充套件函式
val l = mutableListOf(1, 2, 3)
l.swap(0, 2)
//為String類新增擴充套件屬性extprop
var String.extprop: Int
get() = this.length
set(value){
println(this.plus(value))
}
3、Data classes (資料類)
這個特性是把java中的java bean給簡化了一下,開發者可以少寫一些程式碼。
//Java中一個一個JavaBean的寫法
class Student {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age) {
this.age= age;
}
public int getAge{
return age;
}
}
// Kotlin的寫法,會自動生成getter和setter
class Student {
var name:String
var age:Int
}
還有更簡單的寫法:
class Student(var name:String, var age:Int)
可以看到,這種特效能讓開發者少敲些無聊程式碼,多出來的時間可以用來思考,多受歡迎!
4、Higher order functions (高階函式)
高階函式的定義:將函式用作一個函式的引數或者傳回值的函式。
說到函式,不得不提一下,kotlin是屬於函式式程式語言。也就是說,在kotlin裡像c語言那樣可以直接寫個main函式就能執行,不像java還需要先定義一個類。
//java裡,函式脫離不了類
class JavaClass{
public static void main(String[] args] {
System.out.println("hello world.");
}
}
//kotlin裡,函式是頭等公民
//和c語言一樣
fun main() {
println("hello world.")
}
下麵看Kotlin裡的高階函式
//processNumber函式有三個入參,其中
//第三個引數是一個高階函式
//這個高階函式接收兩個Int,傳回一個Int
fun processNumber(a : Int , b: Int,
doSomeThingFunc : (num1 : Int , num2 : Int) -> Int) : Int{
return doSomeThingFunc.invoke(a,b)
}
fun main(args: Array<String>) {
//呼叫processNumber,實現a + b邏輯
processNumber(a = 123, b = 2){
a, b -> a + b
}
//呼叫processNumber,實現a - b邏輯
processNumber(a = 123, b = 2){
a, b -> a - b
}
//呼叫processNumber,實現a * b邏輯
processNumber(a = 123, b = 2){
a, b -> a * b
}
//呼叫processNumber,實現a / b邏輯
processNumber(a = 123, b = 2){
a, b -> a / b
}
}
5、Multi platform (多平臺支援)
目前在Windows, Linux, Mac上都能用Kotlin開發,工具支援非常完善。Kotlin可以跑Java虛擬機器,所以所有平臺都能執行;Kotlin可以生成javascript,所以每個平臺上有瀏覽器就能執行;Kotlin Native可以生成arm32,arm64,x86,mips,x64平臺的機器程式碼,所以Kotlin可以說”無論哪個作業系統,哪個晶片平臺,無論是web還是嵌入式,哪都能跑Kotlin”,強到令人髮指,快要上天了!
6、CoRoutines (協程)
協程類似於執行緒,讓程式碼可以併發執行。協程相對於執行緒來說,更輕量級。在一個行程裡可以建立幾百萬個協程,而執行緒則不行,因為執行緒在核心中真正對應了一個輕量級執行緒,所以一個行程開不了太多執行緒。
和Go語言一樣,Kotlin提供了協程支援。
結束語
從以上分析來看,Kotlin精通多種技能,卻並不像鳩摩智那般多而不精,在取代Java生成位元組碼上Kotlin就非常精,改善了Java而且還有獨創技能,自成一派,完全可以取代Java了。該來的終於要來了,Android開發中,Kotlin取代Java大勢所趨,Android開發者是時候擁抱Kotlin了。
最後,附上官方中文語言參考地址:
https://www.kotlincn.net/docs/reference/
官方推薦的Kotlin Andriod開發書籍《Kotlin For Android Developers》,國內已經翻譯為中文版本,非常適合與轉向Kotlin的Android開發者。推薦一下。
●編號470,輸入編號直達本文
●輸入m獲取到文章目錄
Java程式設計
更多推薦《25個技術類公眾微信》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。