編輯:關於android開發
這是關於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
Android事件總線,android總線Android中Activity、Service、Fragment之間的相互通信比較麻煩,主要有以下一些方法: (1)使用廣播,
Android面試准備 第二天 第五例 數據存儲 5、Activity用SharedPreferences保存數據,大小有木有限制? 個人理解:SharedPrefere
Gui系統之View體系(2)---View的setContent,---viewsetcontent1.從SetContentView講起 1.1Activty的set
Reveal-加載利用全局斷點 在網上搜怎麼加載Reveal的,好多都是利用Reveal.frameWork來拖進工程裡面,這樣很不方便,每次更換新工程都要這樣做,這