讓你的程式碼量減少3倍!使用kotlin開發Android(三) 縮短五倍的Java Bean

androidwing發表於2016-10-13

回顧一下

哈,沒想到你已經堅持不懈看到第三篇了,不錯哈~堅持就是勝利。
本文同步自博主的私人部落格wing的地方酒館

上一篇文章中,我們介紹了擴充套件函式,這裡對上一篇進行一點小小的補充。

還記得textview是如何setText()的嗎

textView.text = "hello kotlin"複製程式碼

不知道你有沒有想過,這個.text是如何實現的呢。 哈哈,其實你們大概已經猜到了。就是通過擴充套件函式實現的

public    var    TextView.text:    CharSequence        
  get()    =    getText()            
  set(v)    =    setText(v)複製程式碼

開始今天的內容

今天介紹的是一種叫做資料類的類,他沒有什麼功能,只負責儲存資料,也就是我們常說的Java Bean,通常,在Java語言裡,我們定義一個實體,是這樣的

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;
    }

}複製程式碼

可以看到,僅僅兩個屬性,加上getter setter有這麼多程式碼。那麼kotlin是什麼樣子呢?

data class User(var name: String, var id: String)複製程式碼

你不要說我了個擦,這確實是全部程式碼。。沒有少東西了。可以看到語法,括號裡跟著引數,也是一種構造器。並且不用getter setter。

使用的時候正常使用就可以了。

val user = User("wing","222")
    user.id = "300"複製程式碼

這裡提到一點,var 和val的區別。var一般是變數,val一般是常亮,即不可變數,也多用於只是用一次的變數。

這裡你可能有疑問了,如果構造器是單參或者空參的呢? 語法如下:

class User {
    var name: String? = null
    var id: String? = null

    constructor(name: String) {
        this.name = name
    }

    constructor(name: String, id: String) {
        this.name = name
        this.id = id
    }
}複製程式碼

舉個例子

接下來以一個點選按鈕,傳遞資料類向下一個Activity為栗子,把之前的知識應用一下。

首先,新建一個SecondActivity,提供一個靜態方法,用於Activity的轉跳。想必大家都知道這樣的好處,就是讓呼叫者不必看原始碼就知道需要什麼引數。如果你按照java寫,就會發現沒有static這個關鍵字!不要慌,這裡可以使用 伴生物件 來實現。伴生物件是伴隨這個類宣告週期的物件~下面看詳細用法。

class SecondActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        toast(intent.getStringExtra(USER))
    }

   //建立一個伴生物件
    companion object{
        //extra的key
        val USER = "USER"
        fun startActivity(context: Context,user:User ){
            val intent = Intent(context,SecondActivity::class.java)
            intent.putExtra(USER,user)
            context.startActivity(intent)
        }
    }
}複製程式碼

在第一個Activity中,給按鈕設定監聽器,同時轉跳到第二個Activity並且傳遞User物件。

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    button.setOnClickListener {
      val user = User("name")
      user.id = "100"
      SecondActivity.startActivity(this,user)
    }

  }
}複製程式碼

大功告成了!接下來執行下apk,看看第二個Activity成功接收到了傳遞的User(對了別忘了把User序列化).

對比一下,嗯哼?比Java少了多少? 有沒有很爽啊哈。
本文這就結束了(嫌文字太短?不要急啦,先去動手實踐下咯。。系列文章,既然挖了坑,就不會拖更的(吧..))

本專案使用的程式碼地址

歡迎加入Kotlin小樂園群:479109923

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

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

相關文章