kotlin開發(fā)經驗談1

筆者最近幾個月在學習kotlin瞎颗,然后用來重構項目坐搔,反正是不斷踩坑中婉徘,踩的很開心??漠嵌,這個過程中碰到了一些問題咐汞,值得記錄下來, 供大家參考。

如何定義一個非空變量

本次的問題是如何定義一個非空變量儒鹿,有哪些實現(xiàn)手段呢化撕?

在此之前糊肤,我先講講如何定義常量變量贯莺,為了方便學習kotlin的語法特性卢未,推薦使用idea開發(fā)工具撵枢。

那么現(xiàn)在創(chuàng)見一個java工程脐湾,選擇kotlin支持钦购。
創(chuàng)建一個文件您单,內容如下

class User {
    var name:String? = null
    val id:String? = null
}

fun main(args: Array<String>) {
    println("Hello World")

}

在這里我們定義了一個model類User却紧,User類有兩個屬性贱傀,一個是變量name可空惨撇,一個是常量id可空

image.png

我們想知道這個文件最終對應的java代碼是什么,有什么辦法呢府寒,我只會反編譯額魁衙。接著就編譯這個App.kt文件,idea中選擇app.kt文件株搔,然后單擊右鍵Recompile App.kt,就會編譯出class文件剖淀,接著我們用JD_GUI反編譯工具,去查看這兩個class文件的內容

image.png
image.png

這個就是最終的反編譯出來的java代碼纤房,我們可以理解為kotlin編譯后得到的就是這樣的java代碼纵隔。
我們關注的重點是User類,id是定義的一個常量炮姨,反編譯出來的代碼里面將它設置了為final類型捌刮,默認的訪問級別也是private,這也是kotlin的設計理念(不知道說的對不對_)舒岸,屬性私有化,對外提供geter绅作,seter。而變量name蛾派,就跟我們平常定義java屬性的方式類似俄认,private String name,到此洪乍,如何定義一個常量變量就講完了眯杏,對應生成的java代碼我們也看到了,接下來回到正題典尾,如何定義一個非空變量,有哪些手段?

先看一段代碼片段吧(來自https://github.com/leanote/leanote-android)

image.png
image.png

我們拿這個NoteFragment來描述糊探,我需要在onCreate方法中初始化這個mNoteFragment钾埂,但是我不想讓kotlin的代碼中河闰,出現(xiàn)mNoteFragment?.setMode(mode)這樣的代碼?

image.png

不想各個地方都出現(xiàn)這樣的代碼褥紫,如果把mNoteFragment定義為非空的那就好了姜性,說干就干,該如何修改呢髓考?

不可能直接這樣改
var mNoteFragment: NoteFragment = NoteFragment.newInstance(),這樣有問題的部念,就不多說了。

考慮到kotlin的語言特性我想到的只有
lateinit var mNoteFragment: NoteFragment 這樣在onCreate方法里面初始化是可以的氨菇。
var mNoteFragment: NoteFragment by Delegates.notNull<NoteFragment>()和這種委托的模式

我們先看這一段代碼儡炼,lateinit方式的

class MainActivity {
    lateinit var mNoteFragment: String
    fun onCreate() {
       mNoteFragment = newInstance()
    }
    companion object {
        fun newInstance():String {
            return "NoteFragment"
        }
    }
}

這種情況下生成的java代碼如下

image.png

lateinit var mNoteFragment: String 被翻譯成了@NotNull public String mNoteFragment mNoteFragment被定義為了public訪問級別

接著看看委托模式下的

import kotlin.properties.Delegates

class MainActivity {
    var mNoteFragment: String by Delegates.notNull<String>()
    fun onCreate() {
       mNoteFragment = newInstance()
    }
    companion object {
        fun newInstance():String {
            return "NoteFragment"
        }
    }
}

反編譯的java代碼比較復雜,暫時也沒有深究查蓉,感覺要麻煩多了

image.png

我們定義的mNoteFragment屬性不見了乌询,反而多了一個mNoteFragment$delegate屬性,而且還是在構造方法中做的初始化操作豌研,以及一個$$deletegatedProperties在靜態(tài)代碼塊初始化的不知道什么東西的東西妹田,雖然沒有了mNoteFragment,但是還是有對應的geter,setter方法鹃共,具體就不深究了鬼佣,暫時功力有限。

總結

到此為止霜浴,講完了晶衷。
定義一個非空屬性,基本上常用的手段就是lateinit和委托模式坷随。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末房铭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子温眉,更是在濱河造成了極大的恐慌缸匪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件类溢,死亡現(xiàn)場離奇詭異凌蔬,居然都是意外死亡,警方通過查閱死者的電腦和手機闯冷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門砂心,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛇耀,你說我怎么就攤上這事辩诞。” “怎么了纺涤?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵译暂,是天一觀的道長抠忘。 經常有香客問我,道長外永,這世上最難降的妖魔是什么崎脉? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮伯顶,結果婚禮上囚灼,老公的妹妹穿的比我還像新娘。我一直安慰自己祭衩,他們只是感情好灶体,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汪厨,像睡著了一般赃春。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劫乱,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天织中,我揣著相機與錄音,去河邊找鬼衷戈。 笑死狭吼,一個胖子當著我的面吹牛,可吹牛的內容都是我干的殖妇。 我是一名探鬼主播刁笙,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谦趣!你這毒婦竟也來了疲吸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤前鹅,失蹤者是張志新(化名)和其女友劉穎摘悴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舰绘,經...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蹂喻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捂寿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片口四。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖秦陋,靈堂內的尸體忽然破棺而出蔓彩,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布赤嚼,位于F島的核電站大磺,受9級特大地震影響,放射性物質發(fā)生泄漏探膊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一待榔、第九天 我趴在偏房一處隱蔽的房頂上張望逞壁。 院中可真熱鬧,春花似錦锐锣、人聲如沸腌闯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姿骏。三九已至,卻和暖如春斤彼,著一層夾襖步出監(jiān)牢的瞬間分瘦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工琉苇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘲玫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓并扇,卻偏偏與公主長得像去团,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子穷蛹,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容