在 Kotlin 中使用 by 關鍵字

Kailash Vaviya 2023年1月30日
  1. 在 Kotlin 中使用 by 關鍵字
  2. 使用 by 關鍵字將屬性的實現委託給 Kotlin 中的另一個物件
  3. 使用 by 關鍵字將介面的實現委託給 Kotlin 中的另一個物件
在 Kotlin 中使用 by 關鍵字

Kotlin 中的 by 是一個軟關鍵字,這意味著它作為關鍵字和基於上下文的識別符號都很有用。by 關鍵字表示由提供。

Kotlin 自動為每個屬性建立 getter()setter()。當我們定義一個 var 屬性時,它會獲得一個 get()set() 方法,而 val 屬性預設會獲得一個 get() 方法。

當我們想在其他地方定義這些方法時,Kotlin by 關鍵字會很有幫助,比如在函式初始化期間而不是在屬性初始化期間。

當我們使用 by 關鍵字時,get()set() 方法由關鍵字後面的函式提供,而不是預設方式,這意味著它們是委託的。

在 Kotlin 中使用 by 關鍵字

by 關鍵字在兩個地方很有幫助:(i) 將介面的實現委託和 (ii) 將屬性的訪問器委託給另一個物件。

如上所述,它用於委託屬性的實現。

語法:

val/var <property_Name>: <Type> by <expression>

Kotlin by 關鍵字與屬性的最常見用法是:

  • 懶惰的屬性
  • 可觀察的屬性
  • 在地圖中儲存屬性

在實現與另一個物件的介面時,它的工作方式類似,但有一些主要區別。

  1. 在提供函式的地方定義 by 關鍵字而不是函式
  2. 由於是和介面一起使用,所以也是實現繼承的有效替代方案

使用 by 關鍵字將屬性的實現委託給 Kotlin 中的另一個物件

本節將通過 Kotlin by 關鍵字的示例來為每個用例委託屬性。

在 Kotlin 中使用帶有惰性屬性的 by 關鍵字

在 Kotlin 中,lazy() 函式將 lambda 作為輸入並返回 Lazy 屬性的例項。

使用 by 關鍵字時,第一個 get() 函式呼叫會執行 lambda 表示式並臨時儲存結果。第二個 get() 函式呼叫返回結果。

這是一個示例來演示它是如何工作的。

val exampleVal: String by lazy {
    println("initial!")
    "Welcome"
}

fun main() {
    println(exampleVal)
    println(exampleVal)
}

輸出:

通過具有惰性屬性的關鍵字使用 Kotlin

在 Kotlin 中使用具有可觀察屬性的 by 關鍵字

這是一個示例,展示了 Kotlin by 關鍵字如何與可觀察屬性一起使用。

import kotlin.properties.Delegates

class Student {
    var Name: String by Delegates.observable("David") {
        value, oldValue, newValue ->
        println("$oldValue -> $newValue")
    }
}

fun main() {
    val stud = Student()
    stud.Name = "John"
    stud.Name = "Doe"
}

輸出:

通過具有可觀察屬性的關鍵字使用 Kotlin

如輸出所示,可觀察屬性採用兩個引數:初始值和修改處理程式。

每次我們為屬性賦值時,處理程式都會執行。因此,我們在賦值之後有三個引數:用於賦值的初始屬性、舊值和新值。

在 Kotlin 的地圖中使用 by 關鍵字儲存屬性

在地圖中儲存屬性允許執行動態任務,例如解析 JSON。這是一個示例,展示了我們如何委託屬性並將它們儲存在地圖上。

class Student(val map_example: Map<String, Any?>) {
    val name: String by map_example
    val ID: Int     by map_example
}

fun main() {
    val s = Student(mapOf(
        "name" to "John Doe",
        "ID"  to 301
    ))
    println(s.name)
    println(s.ID)
}

輸出:

通過關鍵字使用 Kotlin 在地圖中儲存屬性

使用 by 關鍵字將介面的實現委託給 Kotlin 中的另一個物件

除了委託給屬性,Kotlin by 關鍵字還允許將介面委託給另一個物件。這是一個例子來證明這一點。

當一個類與 by 關鍵字一起使用時,它通過將所有公共成員委託給特定物件來實現一個介面。

interface Parent {
    fun print()
}

class ParentImpl(val x: Int) : Parent {
    override fun print() { print(x) }
}

class Child(p: Parent) : Parent by p

fun main() {
    val p = ParentImpl(25)
    Child(p).print()
}

輸出:

通過介面委派的關鍵字使用 Kotlin

作者: Kailash Vaviya
Kailash Vaviya avatar Kailash Vaviya avatar

Kailash Vaviya is a freelance writer who started writing in 2019 and has never stopped since then as he fell in love with it. He has a soft corner for technology and likes to read, learn, and write about it. His content is focused on providing information to help build a brand presence and gain engagement.

LinkedIn

相關文章 - Kotlin Keyword