Kotlin可空型別與非空型別以及`lateinit` 的作用

micro3721發表於2024-06-09

Kotlin可空型別與非空型別以及lateinit 的作用

在 Kotlin 中,變數可以是可空型別或非空型別。可空型別表示變數可以包含一個空值(null),而非空型別表示變數不能包含空值。

可空型別與非空型別

  • 非空型別:預設情況下,Kotlin 中的變數是非空型別。例如,var recyclerView: RecyclerView 表示這個變數永遠不能為 null。在編譯時,Kotlin 會強制保證非空型別的變數在任何時候都不為 null

  • 可空型別:可空型別變數可以包含 null 值。例如,var recyclerView: RecyclerView? 表示這個變數可以為 null。在使用可空型別變數時,必須進行空值檢查以避免 NullPointerException

lateinit 的作用

使用 lateinit 修飾符可以宣告一個非空型別的變數,並允許稍後初始化它。這在 Android 開發中很常見,因為許多檢視元件(如 RecyclerView)需要在 onCreateonViewCreated 方法中初始化,而不能在宣告時立即賦值。

如果不使用 lateinit,可以選擇將變數宣告為可空型別(即 RecyclerView?),但這樣在每次使用該變數時都需要進行空值檢查,增加了程式碼的複雜性。例如:

// 不使用 lateinit,宣告為可空型別
private var recyclerView: RecyclerView? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // 初始化 recyclerView
    recyclerView = findViewById(R.id.my_recycler_view)

    // 使用 recyclerView 時需要進行空值檢查
    recyclerView?.layoutManager = LinearLayoutManager(this)
    recyclerView?.adapter = MyAdapter(myDataset)
}

使用 lateinit 則可以避免每次使用變數時的空值檢查:

// 使用 lateinit 宣告非空型別變數
private lateinit var recyclerView: RecyclerView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // 初始化 recyclerView
    recyclerView = findViewById(R.id.my_recycler_view)

    // 直接使用 recyclerView,無需空值檢查
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.adapter = MyAdapter(myDataset)
}

總結

使用 lateinit 修飾符可以在 Kotlin 中宣告一個非空型別的變數,並允許稍後初始化它,從而避免了每次使用該變數時的空值檢查,提高了程式碼的簡潔性和可讀性。

程式碼參考

相關文章