Kotlin-學習筆記-注意事項(一)

1 三重引號(""")

模板 裏面可以包含任意字符 ,包括雙引號,單引號,換行,會車,反斜槓等不能直接寫在字符串雙引號裏面的字符
主要是用來方便複製HTML,JavaScript代碼

2 is運算符進行類型檢測

is做過類型判斷以後,變量會被系統自動轉換爲 推斷類型

fun getStringLength(obj :Any):Int?{
    if (obj is String) {
        // 做過類型判斷以後,obj會被系統自動轉換爲String類型
        return obj.length
    }
    // 這裏的obj仍然是Any類型的引用
    return null
}
3 vararg 可變參數
fun vars(vararg v: Int) {//可變參數 --》相當於數組
    for (vt in v) {
        print(vt)
    }
}
4 擴展函數不可覆蓋(overriding)

擴展函數是靜態解析的,並不是接收者類型的虛擬成員。
調用哪一個擴展函數,是由調用函數的對象表達式決定的,而不是動態類型決定的
如下官方文檔的例子

open class View {
    open fun click() = println("View clicked")
}

class Button: View() {
    override fun click() = println("Button clicked")
}
fun View.showOff() = println("I'm a view!")
fun Button.showOff() = println("I'm a button!")

執行結果

fun main(args: Array<String>) {
	val view: View = Button()
    view.click()   //Button clicked
    view.showOff() //I'm a view!
}

方法的覆蓋(overriding)對類中的成員函數是有效的,但是擴展函數不能被覆蓋
click 是類中的成員函數,可重寫,父類 類型指向子類對象,調用子類函數(類的多態)
showOff 是擴展函數,擴展函數並不是類的一部分,他們申明在類的外部,被調用的函數依賴已被申明的靜態類型。

5 Kotlin 沒有三元表達式

Kotlin 沒有三元表達式,一般用if表達式替代
如Java : Int num = 2>1 ? 2:1
可用Kotlin : var num = if (2>1) 2 else 1

6 Elvis操作符 ?:

主要用於null的安全檢查,Elvis操作符是一個二元運算符,如果第一個操作數不爲null,返回自己,否則返回第二個操作數。
如Java : String displayName = name !=null ? name : “unknown”;
Kotlin : val displayName = name?:“unkown”

7 NULL檢查機制

Kotlin的空安全設計對於聲明可爲空的參數,在使用時要進行空判斷處理,有兩種處理方式,
1 字段後加 !!. 像Java一樣拋出空異常,
2 另一種字段後加 ?. 可不做處理返回值爲 null或配合?:做空判斷處理

    //類型後面加?表示可爲空
    var age: String? = null
    
    //拋出空指針異常
    val ages = age!!.toInt()

    //不做處理返回 null
    val ages1 = age?.toInt()
    //age爲空返回-1
    val ages2 = age?.toInt() ?: -1
8 Kotlin 八進制不支持

十進制:123
十六進制以 0x 開頭:0x0F
二進制以 0b 開頭:0b00001011
注意:Kotlin 八進制不支持

9 比較兩個數字

Kotlin 中沒有基礎數據類型,只有封裝的數字類型,你每定義的一個變量,其實 Kotlin 幫你封裝了一個對象,這樣可以保證不會出現空指針。數字類型也一樣,所有在比較兩個數字的時候,就有比較數據大小和比較兩個對象是否相同的區別了。

在 Kotlin 中,三個等號 === (或 !==)表示比較對象地址,(引用相等:兩個無關聯的對象指向了內存中的同一個實例)
兩個 == (或!=)表示比較兩個值大小。(結構相等:兩個對象分別位於內存中的不同地址但他們但值卻是相同的)

10 單例

java 單例的寫法一般有5種,相對於的Kotlin 也是5種
1 最簡單寫法

object +class 

也就是餓漢式(線程安全,調用效率高,但是不能延時加載):
不推薦這種實現方式
2 內部靜態類寫法- 推薦寫法
(線程安全,調用效率高,可以延時加載)

class LazyThreadSafeStaticInnerObject private constructor(){
    companion object {
        fun getInstance() = SingletonHolder.holder
    }
    private object SingletonHolder{
        var holder = LazyThreadSafeStaticInnerObject()
    }

}

3 枚舉類寫法
(線程安全,調用效率高,不能延時加載,可以天然的防止反射和反序列化調用)

enum class Singleton {
    //枚舉元素本身就是單例
    INSTANCE;

    //添加自己需要的操作
    fun singletonOperation() {}
}

參考如下 -相當詳細,當做複習
Kotlin擴展函數和擴展屬性筆記
Kotlin下的5種單例模式
Kotlin教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章