讓你的程式碼量減少3倍!使用kotlin開發Android(四) kotlin bean背後的祕密

androidwing發表於2016-10-20

上一篇我們介紹了縮短五倍的java bean,不知道你在看的時候有沒有一種疑問捏?

本文同步自博主的私人部落格wing的地方酒館

再來回顧一下,兩種程式碼的對比

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

    public User(String name, String id) {
    this.name = name;
    this.id = id;
}

public String getName() {
    return name;
}

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

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}複製程式碼
data class User(var name: String, var id: String)複製程式碼

可以發現,程式碼是少了,但是好像不太一樣,為什麼呢? 可能很多人會有這樣的疑問,在java bean中 通常會將成員變數設為私有,不對外開放,並且提供getter,setter來提供對外訪問,可是kotlin bean確沒有。於是你開始嘗試對data class擴充,並且發現。。如果設定了private 就不能提供getter,setter了。

如果你有疑問,請繼續看下去。唯一看透真相的是外表看似大人,但大腦萎縮只有兒童智商的名偵探wing!

讓你的程式碼量減少3倍!使用kotlin開發Android(四) kotlin bean背後的祕密
名偵探wing

線索

大家都知道。。kotlin是執行在jvm的語言,所以理所當然的,他是遵循jvm虛擬機器規範的,也就是說生成的都是class檔案,所以我們可以反編譯class為java語言,那他與java做個對比。就可以明確的得到我們想要的答案。

首先建立一個kt檔案,鍵入如下內容:

class User(){
    public var name:String = "hah"
}複製程式碼

明顯這是一個User類,他具有一個String成員name,這時候在命令列使用kot
linc編譯:

kotlinc user.kt複製程式碼

得到一個class檔案,將class用JD_GUI開啟可以得到如下程式碼:

public final class User
{

  @NotNull
  private String name = "hah";

  @NotNull
  public final String getName() { return this.name; } 
  public final void setName(@NotNull String <set-?>) { Intrinsics.checkParameterIsNotNull(<set-?>, "<set-?>"); this.name = <set-?>;
  }
}複製程式碼

諾,真相大白了,事實說明在kotlin中,不需要private並且通過getter與setter,因為由以上結論得出kotlin中的public等價於java中private + getter + setter!!!

嗯哼?這下有沒有解決你的疑慮?我們可以順便看看伴生物件是如何實現的。

class User(){
public var name:String = "hah"


companion object{
   fun getName():String{
        return "name"
}
}
}複製程式碼

反編譯以後,與user.class同級目錄下會多處一個User$Companion.class的檔案,他就是user的伴生物件了,檢視對應java程式碼如下:

public final class User$Companion
{
  @NotNull
  public final String getName()
  {
    return "name";
  }
}複製程式碼

看到其實伴生物件並不是static實現的,所以說跟static還是有區別的,既然是object 那麼應該就不是class ,或者說這個class只有一個例項,可以說另一種奇葩的單利模式吧。總之這個物件會跟隨user生,跟隨user死,然後她有一個例項,提供了一個方法。目前我的理解是這樣的,如有錯誤,歡迎指出~~

本文這就結束了(嫌文字太短?不要急啦,先去動手實踐下咯。。系列文章,既然挖了坑,就不會拖更的(吧..))

歡迎加入Kotlin小樂園群(這是一個高質量、優秀的圈子):479109923

如果你是Android開發者,那麼你還可以來 wing的酒館:425983695來分享你的開發經驗哦

一個使用Kotlin開發的完整專案地址

相關文章