網站首頁 編程語言 正文
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
相關推薦
- 2023-08-13 Spring Security 構建基于 JWT 的登錄認證
- 2022-12-24 C#?Math中常用數學運算的示例詳解_C#教程
- 2022-06-01 C語言?深入淺出講解指針的使用_C 語言
- 2022-08-29 Python軟件包安裝的三種常見方法_python
- 2022-04-18 python字符串格式化(%格式符和format方式)_python
- 2021-12-13 C++ 之常量const(常對象、常數據成員、常成員函數)
- 2022-04-25 django數據庫遷移migration實現_python
- 2022-11-19 C#?使用?Filestream?修改大文件指定位置數據_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支