在 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
關鍵字與屬性的最常見用法是:
- 懶惰的屬性
- 可觀察的屬性
- 在地圖中儲存屬性
在實現與另一個物件的介面時,它的工作方式類似,但有一些主要區別。
- 在提供函式的地方定義
by
關鍵字而不是函式 - 由於是和介面一起使用,所以也是實現繼承的有效替代方案
使用 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 中使用具有可觀察屬性的 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 的地圖中使用 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)
}
輸出:
使用 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()
}
輸出:
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