<center id="qkqgy"><optgroup id="qkqgy"></optgroup></center>
  • <menu id="qkqgy"></menu>
    <nav id="qkqgy"></nav>
    <xmp id="qkqgy"><nav id="qkqgy"></nav>
  • <xmp id="qkqgy"><menu id="qkqgy"></menu>
    <menu id="qkqgy"><menu id="qkqgy"></menu></menu>
    <tt id="qkqgy"><tt id="qkqgy"></tt></tt>

  • 一、介紹

    ????????如今在Android開發中,應用層開發語言主要是Java和Kotlin,Kotlin是后來加入的,主導的語言還是Java。kotlin的加入仿佛讓會kotlin語言的開發者更屌一些,其實不然。

    ????????有人說kotlin的引入是解決開發者復雜的邏輯,并且對空指針控制的比較友好,但是我們在開發過程中會發現,好像并不是這么回事,甚至有些開發者發現,在使用過程中會出現莫名其妙的錯誤,而且還不好定位。

    ????????這時候,我們應該去分析,kotlin適不適合自己,自己能不能駕馭?

    二、分析Java與kotlin實戰中的利與弊

    ????????學過政治都知道,任何東西都是一把雙刃劍,既有好的一面也有不好的一面。不能什么都照搬過來。kotlin的好是建立在你已很好的掌握,但是不好的是你如果只會基礎,在使用過程中,無法避免一些異常情況。但是Java的友好是適合新手使用,普及度高。

    kotlin的弊端與分析

    1、參數為null

    參數為null這種很容易引起空指針,為什么會出現這種情況?是受Java的寫法有關系
    Java:
    public void log(String txt)
    Kotlin:
    public fun log(txt:String)

    正常Java你是可以傳null進去,但是在kotlin,你傳null就會報錯

    ?分析:

    Java中,你參數可以傳任何,你傳null也是沒問題,但是你在kotlin中,就沒有這么隨意了,這是為什么呢?

    ?在kotlin中,任何參數都會被修飾,為空或者不為空,默認是NotNull。如果你不能傳遞null值過去。

    如何避免?

    只要我們是通過kotlin語法,你在任何參數申明都需要設置成為可為null

    public fun log(txt:String?)

    這個時候,在參數中,已變成可為null。

    2、lateinit 報錯未初始化先使用

    ????????lateinit 是稍后初始化,這個只能做全局,不能出現在方法體,但是也有個問題。如果你用lateinit
    修飾一個變量,那么這個變量可以不先申明變量值,等使用時再初始化。

    但是這個也會出現一個問題,如果你沒初始化就使用會報錯
    lateinit var txt: String public fun log() { println(txt) }

    ????????有人會說,我不能判空嘛?判空也不行。只要你使用之前就必須初始化,否則就會報錯。這個問題在新手特別容易犯錯。

    ????????所以為什么這個關鍵字往往出現在修飾View的初始化使用比較多。這個在使用的時候進行判空,所以該字段默認為null,但是你使用必須要有值,只要你調用get方法就會觸發。

    思考:

    有人會問,如果我直接修改變量的get方法,如果為null,那么get直接給他初始化。

    ?lateinit不允許修改set和get。

    ????????但是Java就不會,Java是所見即所得,你的東西就是你的東西,kotlin是通過自己的語言限制,翻譯成Java語言。所以,你不了解或者說不清楚目標類,很容易造成風險,并且這種bug被帶到線上概率很大

    3、參數類型強轉"!!"導致null空指針

    這種錯誤在方法調用很容易出現,而且這種BUG的概率非常高,導致項目質量很差。

    public fun log(txt:String)

    分析:

    我們申請一個方法,參數不為null,在Java過程中,這種你不需要管,直接調用,一般對null的判斷會在方法體中進行
    Java:
    public void log(String txt){

    if(txt!=null){}

    }

    但是你在kotlin中,只能在調用處進行判斷,否則就要將參數通過強制表示不為null,"!!"

    我們在項目中進程遇到log(msg!!)這種錯誤的寫法,這種寫法,如果你的實參申請可以為null,但是形參不能為null,這個時候你只能通過"!!"來強轉,但是:你的實參如果為null,這個時候就會報空指針,這是為什么?

    這是因為你的實參在調用時已進行強制轉換,也會提前進行空指針異常檢查,所以在使用?"!!"強轉符號時,一定要判空,否則會報錯,但是Java中,我們隨便傳null。

    4.形參為Val修飾的常量,無法修改

    在kotlin中,形參是傳值類型,你是無法直接修改變量,必須通過其他變量接收完再修改

    ?默認是Val類型
    public fun addOne(item:Int):Int{ val relVal=item+1 return relVal }

    5.默認為null的變量引用

    默認值為null,如果變量已申請為這種,那么你以后的使用將離不開"?"和"!!"轉換。

    var temp:String?=null

    這種區分全局和局部

    1、全局:

    如果是全局,對于IDE來說,任何時刻都有可能是null,所以在方法中使用,默認當成null來處理

    ?所以,你即使判空,還是不行。需要一輩子跟著"?"和"!!"搭配使用。

    2、局部:

    如果是局部,只要你在使用之前判斷過一次,在合理的校驗范圍內都是有效
    public fun log(mm:String) { var txt:String?=null if (txt==null) return
    txt.length }
    就是這種有起義的原因,導致在實戰中,很多人很難理解

    三、總結

    ????????通過kotlin的自身問題,其實kotlin就是一種插件語言,最終還是翻譯成Java,只是目前來看,通過翻譯的目標類,還是Java本身,但是增加了特別多的校驗,導致寫法和Java有很大的不同。這種不同來自我們的習慣問題。有人提前判空,有人喜歡丟在使用出判空,調用處讓語法自然一些。

    ????????Android應用不像PC,空指針是致命的BUG,出現一個就會導致崩潰。所以,kotlin對空指針校驗特別嚴格,也對使用埋下了隱患,新手可以繞開校驗,但是對于繞開的原理不夠理解,就會引起崩潰。

    ????????kotlin也不是一無是處,他更像是一個插件,插件的好處是自然的,可擴展等也是kotlin的自身優勢。

    ????????所以,通過上面的分析,大家可以自行去選擇項目中的語言,是kotlin還是Java,如果你向往kotlin的寫法,那么就得去了解kotlin的原理,以及要改變自己在Java中的開發習慣。kotlin是先判斷后使用,而Java寫法很隨意,由開發者自行定義,kotlin都是翻譯好的。

    最后,用好可以事半功倍,用不好,會引起各種不好排查的BUG。最后送一句話:水能載舟亦能覆舟。

    技術
    下載桌面版
    GitHub
    百度網盤(提取碼:draw)
    Gitee
    云服務器優惠
    阿里云優惠券
    騰訊云優惠券
    華為云優惠券
    站點信息
    問題反饋
    郵箱:ixiaoyang8@qq.com
    QQ群:766591547
    關注微信
    巨胸美乳无码人妻视频