Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 用Kotlin開發Android應用(III):擴展函數和默認值,kotlinandroid

用Kotlin開發Android應用(III):擴展函數和默認值,kotlinandroid

編輯:關於android開發

用Kotlin開發Android應用(III):擴展函數和默認值,kotlinandroid


這是關於Kotlin的第三篇。

 

原文標題:Kotlin for Android (III): Extension functions and default values

原文鏈接:http://antonioleiva.com/kotlin-android-extension-functions/

原文作者:Antonio Leiva(http://antonioleiva.com/about/)

原文發布:2015-04-06

 

 

在你了解Kotlin的基本知識和怎樣配置你的項目後,現在我們可以聊聊Kotlin能夠為我們做到那些令人關注的事情,而這些Java做不到。記住,如果你對Koklin語言有什麼疑問,你可以查閱官方文檔。官方文檔組織得非常好,並且容易理解。這樣在文章中,我將不涵蓋基本語言的內容。

 

擴展函數

 

Kotlin擴展函數允許我們在不改變已有類的情況下,為類添加新的函數。例如,我們能夠為Activity中添加新的方法,讓我們以更簡單術語顯示toast:

 

1 fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT){

2     Toast.makeText(this, message, duration).show()
3 }

 

我們可以在任何地方(如一個utils文件中)聲明這個函數,在我們的Activity中將它作為普通方法來使用:

 

1 override fun onCreate(savedInstanceState: Bundle?) { 
2     super<BaseActivity>.onCreate(savedInstanceState)

3     toast("This is onCreate!!")

4 }

 

聲明擴展函數只需簡單地在函數名前加上類名就可以了。在調用處,該函數被導入到類中。

 

這能夠幫助我們簡化代碼、讓封閉類超出其限制。但是,我們必須小心,不能過度使用它們。最終,這些函數通常將替代util類。Util方法是靜態且不能被模擬(mock),所以過度使用通常表示我太懶,不願創建委托類。

 

這是另一個有趣的例子,我來解釋另一個有趣的概念:具體化類型(reified type)。

 

1 inline public fun <reified T : Activity> Activity.navigate(id: String) {

2     val intent = Intent(this, javaClass<T>())
3 
    intent.putExtra("id", id)
4 
    startActivity(intent)

5 }

 

內聯函數能用具體化類型,這意味著我們可以用函數內部的類型恢復類,而不是以自變量傳遞類類型。

 

內聯函數與普通函數有點不同。在編譯期間,內聯函數會進行代碼替換,而不是實際調用函數。這可以使一些問題得以簡化。例如,如果有一個自變量是函數,普通函數將在其內部創建一個包含那函數的對象。而內聯函數則在調用它的地方用其代碼來替換,所以為此不要求內部對象。

 

1 navigate<DetailActivity>("2")

 

用具體化類型,我們能夠在函數內部創建intent;用擴展函數,我們能夠直接調用startActivity()

 

可選參數和默認值

 

借助於自變量和構造函數的默認值,你將不再需要進行重載函數了。一句聲明可以滿足你的所有要求。讓我們回到toast例子:

 

1 fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT){

2     Toast.makeText(this, message, duration)

3 }

 

第二個自變量表示toast顯示持續時間。它是可選參數,如果沒有特別說明,它將用Toast.LENGTH_SHORT。現在你有兩種方法去調用這個函數:

 

1 toast("Short Toast!!")
2 toast("Long Toast!!", Toast.LENGTH_LONG)

 

對於第二個例子,我們可能要為lollipop過渡添加自變量:

 

1 inline public fun <reified T : Activity> Activity.navigate(
2 
        id: String,
3         sharedView: View? = null,
4 
        transitionName: String? = null) {
5     ...
6 
}

 

現在我們有兩種不同的方法來調用同一個函數:

 

1 navigate<DetailActivity>("2")
2 navigate<DetailActivity>("2", sharedView, TRANSITION_NAME)

 

甚至有第三種方法,但是在這種情況下沒有太多的意義,但是可以幫助我們理解另一個概念:我們可以用參數的名稱來決定我們要調用哪個參數:

 

navigate<DetailActivity>(id = "2", transitionName = TRANSITION_NAME)

 

可選參數也可以用於默認的構造函數,這樣你就能在一條聲明中獲得多種重載。自定義視圖是一個特殊的例子,因為在Java中,它們需要多個構造函數才能正常工作。這將在下篇文章中說明。

 

總結

 

用這兩個概念,我們可以節省許多代碼,甚至可以實現在Java中不可能實現的事。Kotlin極具表達能力且簡潔。下篇文章將說明Kotlin Android擴展,可以讓我們在Activity中自動地注入視圖,以及在Kotlin中怎樣產生自定義視圖。

 

記住去查看例子的代碼,看看它的實際應用。

 

前一篇:http://www.cnblogs.com/figozhg/p/4983919.html

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved