Kotlin 嵌套函數(shù)開發(fā)技巧詳解
1.嵌套函數(shù)
業(yè)務(wù)開發(fā)中,我們可能會(huì)遇到這樣一個(gè)場(chǎng)景:一個(gè)函數(shù)只會(huì)被某一處多次調(diào)用,且不想讓這個(gè)函數(shù)在該類的其他地方調(diào)用,這個(gè)時(shí)候就需要對(duì)這個(gè)函數(shù)的訪問(wèn)性進(jìn)行進(jìn)一步限制。
private是無(wú)法滿足的,這個(gè)時(shí)候我們就可以使用嵌套函數(shù)提供更好的封裝:
fun test1() {
//被限制訪問(wèn)行的函數(shù)
fun test2(content: String) {
println(content)
}
test2("hahaha")
test2("babababa")
test2("uuuuuuu")
}
這時(shí)候,只有test1()能夠被訪問(wèn),test2()是無(wú)法被除了test1()外的其他地方進(jìn)行訪問(wèn)的
不過(guò)這樣test2()方法體過(guò)大會(huì)導(dǎo)致test1()方法太長(zhǎng),所以嵌套函數(shù)要根據(jù)具體場(chǎng)景選擇性使用
2.@JvmOverloads快捷實(shí)現(xiàn)函數(shù)重載
Android自定義View時(shí),一般需要定義三個(gè)構(gòu)造方法:
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都這樣寫過(guò)于麻煩,這個(gè)時(shí)候就可以借用@JvmOverloads實(shí)現(xiàn)運(yùn)算符重載:
class CustomView @JvmOverloads constructor(
context: Context,
attributes: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attributes, defStyleAttr) {
}
反編譯成java代碼看下:

可以看到,kotlin編輯器會(huì)自動(dòng)幫助我們生成三個(gè)重載構(gòu)造方法。
PS:當(dāng)@JvmOverloads使用在基于已有的WebView、EditText等組件自定義View時(shí),一定要注意第三個(gè)參數(shù)defStyleAttr默認(rèn)值時(shí)不一定為0的,需要根據(jù)繼承的父類組件填充正確的參數(shù)
3.延遲初始化lateinit var
日常開發(fā)中,我們會(huì)使用lateinit var實(shí)現(xiàn)屬性的延遲初始化:
lateinit var mContent: String mContent = "test test"
使用延遲初始化的屬性,當(dāng)我們不確定這個(gè)屬性有沒(méi)有被初始化,可以通過(guò)下面方式判斷:
//判斷mContent有沒(méi)有被初始化
if (this::mContent.isLateinit) {
Log.i("CustomView", "test: ")
}
4.@JvmField減少屬性set和get方法的生成
定義一個(gè)變量:
var mData: String = ""
反編寫成java代碼:

可以看到編譯器會(huì)自動(dòng)幫助我們生成mData的set、get方法,如果不想要編譯幫助我們生成屬性的set、get方法,可以添加@JvmField注解:
@JvmField var mData: String = ""
反編譯成java代碼:

這樣系統(tǒng)就不會(huì)幫助我們生成get、set方法了,因?yàn)榫幾g器將mData的訪問(wèn)修飾符改成了public
以上就是Kotlin 嵌套函數(shù)開發(fā)技巧詳解的詳細(xì)內(nèi)容,更多關(guān)于Kotlin 嵌套函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Ubuntu下搭建Android開發(fā)環(huán)境
對(duì)一個(gè)程序猿來(lái)說(shuō),裝好系統(tǒng)之后的第一件事,一定是搭建開發(fā)環(huán)境,已經(jīng)安裝各種開發(fā)工具,以便之后能方便順利地進(jìn)行程序的開發(fā)。簡(jiǎn)單的介紹下在Ubuntu環(huán)境下搭建Android開發(fā)環(huán)境,雖然基本上和在Windows下沒(méi)有太大差別,但有些細(xì)節(jié)上還是很值得注意的。2014-07-07
Android開發(fā)中匿名設(shè)備標(biāo)識(shí)符OAID使用及初始化
這篇文章主要為大家介紹了Android開發(fā)中匿名設(shè)備標(biāo)識(shí)符OAID使用及初始化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Android使用ViewStub實(shí)現(xiàn)布局優(yōu)化方法示例
這篇文章主要為大家介紹了Android使用ViewStub實(shí)現(xiàn)布局優(yōu)化方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Jenkins打包android應(yīng)用時(shí)自動(dòng)簽名apk詳解
這篇文章主要介紹了Jenkins打包android應(yīng)用時(shí)自動(dòng)簽名apk詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Android 中ViewPager中使用WebView的注意事項(xiàng)
這篇文章主要介紹了Android 中ViewPager中使用WebView的注意事項(xiàng)的相關(guān)資料,希望通過(guò)本文大家在使用過(guò)程中遇到這樣的問(wèn)題解決,需要的朋友可以參考下2017-09-09
Android仿微信列表滑動(dòng)刪除 如何實(shí)現(xiàn)滑動(dòng)列表SwipeListView
這篇文章主要為大家詳細(xì)介紹了Android仿微信列表滑動(dòng)刪除,如何實(shí)現(xiàn)滑動(dòng)列表SwipeListView,感興趣的小伙伴們可以參考一下2016-08-08
Android實(shí)現(xiàn)把文件存放在SDCard的方法
這篇文章主要介紹了Android實(shí)現(xiàn)把文件存放在SDCard的方法,涉及Android針對(duì)SDCard的讀寫技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09

