Kotlin學習記錄
筆者就職的小組近日正籌備新專案,預備在新專案中引入kotlin以便適配之后Google的各種新框架或特性等(如jetpack compose就是使用kt),而且個人認為kt的空安全特性有利于降低專案的維護難度與提高應用的穩定性,在此記錄一下自己的入坑之旅,
Kotlin變數宣告與型別判斷
kt不需要顯示地宣告變數型別,而是類似flutter的宣告語法以賦值的型別判斷,以var/val替代原宣告變數的位置,需要宣告型別則是在變數名后加“:Class”,而且摒棄final關鍵字,以val替代其功能,即val實際上是“final var”;這里需要明確final關鍵字其實是非常優秀的一個關鍵字,其表示的之后值不可變或指向物件不可變可以極大地減輕我們閱讀理解代碼的難度,但誠然不少開發者覺得加個final“作業量加大”就較少使用,val就是解決這“作業量加大”的問題,
val str1 = "hello"
val str2: String = "hello again" // 可選擇是否宣告變數型別
var str3 = "hello where"
val str4 = "hello here"
str3 = "hello again" // str3是var允許多次賦值或修改指向物件
str4 = "bye" // str4是val只允許一次賦值,因而該行代碼在IDE內會飄紅報錯
kotlin空安全
應該不少同學都在專案中遇到過外網報出的空指標crash,我們通常最直接了當的操作就是直接加一層如下的空判斷,這的確非常有效,但是專案中必然不止兩三個這種場景,各種監聽回呼的注銷都加上這么一個空判斷,安全是安全,丑也是真的丑,因此kt的空安全就很好地解決了這個煩惱
if (mImpController !== null) {
mImpController.released();
}
Kotlin將變數型別分為不可為空與可能為空兩種(我們開發時盡量采用前者),默認的型別宣告就是不可能為空,只有在宣告時在變數名后添加“?”才表示可以為空,(感覺這有點像 int szBoy = (jmBoy == null ? null : 1); ,如果沒有問號就沒有這個機會),對于不可為空的變數便可以直接呼叫方法而不用擔心發生空指標crash,因為它必不為null這個不難理解;而對于可能為空的變數,呼叫方法前它必須添加“?”或者“!!”來檢查當前變數不為null才會往下執行方法,“?”是為null不呼叫,“!!”則是為null拋例外Illegalstateexception,可以理解為前者用于外網業務場景,后者用于除錯定位問題,這樣一來,上述的場景在kt的寫法如下,簡潔大氣
// 假設mImpController為可能為空的變數
var mImpController: ImpController? = ImpController
fun destroy() {
mImpController?.released();
}
這時可能有的同學會引出一個疑問,如果一個可空物件因為為null而沒有執行對應方法,那么原本用于承接該方法回傳值的變數應該是什么型別呢?好像有點僵硬,下面舉個例子,看完代碼大家應該明白kotlin的可空傳遞性是什么含義了,
fun test() {
var mNonnullField: Int = mImpController?.getInt(); // 編譯失敗,型別不正確
var mNullableField: Int> = mImpController?.getInt(); // 編譯成功
}
But 作為android開發,我們常常對一個activity做初始化時是在onCreate中進行,也就是說可能無法對成員變數在宣告階段就完成賦值,這對于默認非空的kotlin變數宣告就有些許尷尬了,對此kotlin 的解決辦法是引入latinit關鍵字,功能如名——“延遲初始化”,這就需要我們開發者自己把握其呼叫時機了,要保證呼叫時該變數已經完成初始化,but but總的來說這種型別的場景依然優于java代碼處處判空的操作,而且基本只需防止activity在onCreate階段crash導致未完成初始化就走onDestroy的場景,對此kotlin也提供了lateinit專屬的isInitialized方法判斷其有無完成初始化,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/298691.html
標籤:其他
