歡迎光臨
每天分享高質量文章

那個即將取代Java的Kotlin,像不像鳩摩智?

來自:麻辣軟硬體(微訊號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(123)
l.swap(02)

//為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:Stringvar 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、資料庫、運維等。

    贊(0)

    分享創造快樂