使用Kotlin開發Android應用(III):擴充函數和預設值

來源:互聯網
上載者:User

標籤:android   kotlin   

使用Kotlin開發Android應用(III):擴充函數和預設值

@author ASCE1885的 Github 簡書 微博 CSDN
原文連結

通過前面兩篇文章,我們學習了Kotlin的基本知識,並知道如何配置工程,本文將接著介紹Java沒有的而Kotlin實現了的有趣的特性。記住當你對Kotlin語言有任何疑問時,請參考官方指南。該指南組織的很好,而且容易理解,本文將不會介紹語言的基本知識。

擴充函數

Kotlin的擴充函數功能使得我們可以為現有的類添加新的函數,而不用修改原來的類。例如,我們可以為一個activity添加一個新函數,用於顯示一個toast:

fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT){?    Toast.makeText(this, message, duration)?.show()}

我們可以在任何地方聲明這個函數(例如在一個utils檔案中),然後像使用普通函數一樣在這個activity中使用它:

override fun onCreate(savedInstanceState: Bundle?) {    super<BaseActivity>.onCreate(savedInstanceState)?    toast("This is onCreate!!")?}

聲明一個擴充函數很簡單,只需要在函數名之前添加指定的類名即可。在調用時,該函數會以匯入的方式添加到這個類中。

擴充函數協助我們簡化代碼,並極大的利用封閉的類。不過我們要小心並且不過度使用它。使用擴充函數的一個結果是它通常用於替代工具類。工具函數是靜態而且不能被mocked,因此過度使用工具函數通常是我們懶得建立託管類的結果。

下面是另一個有趣的例子,用於解釋另一個有趣的概念:具體化(reified)類型。

inline public fun <reified T : Activity> Activity.navigate(id: String) {?    val intent = Intent(this, javaClass<T>())?    intent.putExtra("id", id)?    startActivity(intent)?}

內嵌函式可以使用具體化(reified)類型,這意味著我們可以在一個函數內部通過類型來恢複一個類,而不是將類的類型作為一個參數傳入。

內聯函數和普通函數有一點區別。內聯函數在編譯期間會進行代碼替換,而不是真的進行函數調用。在某些情況下可以簡化問題。例如,如果我們有一個函數會作用參數進行傳遞,普通函數會在內部建立一個包含這個函數的對象;而內聯函數將會在函數被調用的地方使用代碼直接替換函數調用,因此不需要建立一個內部對象。

navigate<DetailActivity>("2")

使用reified類型,我們可以在一個函數內部建立一個intent,並使用擴充函數,這樣我們可以直接調用startActivity()。

選擇性參數和預設值

藉助於參數和建構函式的預設值,你將不再需要進行函數重載了。一個函式宣告就可以滿足你所有的需求。讓我們回到toast的例子:

fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT){?    Toast.makeText(this, message, duration)?}

第二個參數表示toast的顯示期間,這是一個選擇性參數,但沒有顯式指定時,將使用預設的Toast.LENGTH_SHORT。因此,你有兩種方式調用這個函數:

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

回到前面第二個例子,我們可能想要增加幾個參數來支援lollipop動畫:

inline public fun <reified T : Activity> Activity.navigate(?        id: String,?        sharedView: View? = null,?        transitionName: String? = null) {??    ...

現在我們有兩種方式調用同一個函數:

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

甚至還有第三種方式,在這種情況下意義不大,但有助於協助我們理解另一個概念:我們可以使用參數名字來決定哪個參數會被調用:

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

選擇性參數也可以被用在預設建構函式中,因此,你可以只聲明一個建構函式,但會得到很多重載。自訂views是一個特殊例子,在Java中它們需要多於一個建構函式以便正確的運行,我會在下一篇文章中進行介紹。

總結

使用擴充函數以及選擇性參數和預設值,我們可以節省很多代碼,甚至完成在Java中無法做到的事情。Kotlin真的更具表達性而且簡潔。下一篇文章將會介紹Kotlin的Android擴充,它使得我們可以在activities中自動注入views,同時也會介紹使用Kotlin建立自訂views。

請記得查看實際運行我們的Demo例子,實踐出真知。

文末攝影鑒賞

使用Kotlin開發Android應用(III):擴充函數和預設值

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.