日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Kotlin?嵌套函數開發技巧詳解_Android

作者:長安皈故里 ? 更新時間: 2022-10-28 編程語言

1.嵌套函數

業務開發中,我們可能會遇到這樣一個場景:一個函數只會被某一處多次調用,且不想讓這個函數在該類的其他地方調用,這個時候就需要對這個函數的訪問性進行進一步限制。

private是無法滿足的,這個時候我們就可以使用嵌套函數提供更好的封裝:

fun test1() {
    //被限制訪問行的函數
    fun test2(content: String) {
        println(content)
    }
    test2("hahaha")
    test2("babababa")
    test2("uuuuuuu")
}

這時候,只有test1()能夠被訪問,test2()是無法被除了test1()外的其他地方進行訪問的

不過這樣test2()方法體過大會導致test1()方法太長,所以嵌套函數要根據具體場景選擇性使用

2.@JvmOverloads快捷實現函數重載

Android自定義View時,一般需要定義三個構造方法:

class CustomView : View {
    constructor(context: Context) : super(context)
    constructor(context: Context, attributes: AttributeSet? = null) : super(context, attributes)
    constructor(context: Context, attributes: AttributeSet? = null, defStyleAttr: Int) : super(
        context,
        attributes,
        defStyleAttr
    )
}

每次自定義View都這樣寫過于麻煩,這個時候就可以借用@JvmOverloads實現運算符重載:

class CustomView @JvmOverloads constructor(
    context: Context,
    attributes: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attributes, defStyleAttr) {
}

反編譯成java代碼看下:

可以看到,kotlin編輯器會自動幫助我們生成三個重載構造方法。

PS:當@JvmOverloads使用在基于已有的WebView、EditText等組件自定義View時,一定要注意第三個參數defStyleAttr默認值時不一定為0的,需要根據繼承的父類組件填充正確的參數

3.延遲初始化lateinit var

日常開發中,我們會使用lateinit var實現屬性的延遲初始化:

lateinit var mContent: String
mContent = "test test"

使用延遲初始化的屬性,當我們不確定這個屬性有沒有被初始化,可以通過下面方式判斷:

//判斷mContent有沒有被初始化
if (this::mContent.isLateinit) {
    Log.i("CustomView", "test: ")
}

4.@JvmField減少屬性set和get方法的生成

定義一個變量:

var mData: String = ""

反編寫成java代碼:

可以看到編譯器會自動幫助我們生成mData的set、get方法,如果不想要編譯幫助我們生成屬性的set、get方法,可以添加@JvmField注解:

@JvmField
var mData: String = ""

反編譯成java代碼:

這樣系統就不會幫助我們生成get、set方法了,因為編譯器將mData的訪問修飾符改成了public

原文鏈接:https://juejin.cn/post/7083264557367427080#heading-1

欄目分類
最近更新