迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

在 Kotlin 中使用 by 关键字

作者:迹忆客 最近更新:2023/03/21 浏览次数:

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 的 Map 中使用 by 关键字存储属性

在 Map 中存储属性允许执行动态任务,例如解析 JSON。这是一个示例,展示了我们如何委托属性并将它们存储在 Map 上。

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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 Java 中延迟几秒钟的时间

发布时间:2023/12/17 浏览次数:217 分类:Java

本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。

如何在 Java 中把 Hashmap 转换为 JSON 对象

发布时间:2023/12/17 浏览次数:187 分类:Java

它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。

如何在 Java 中按值排序 Map

发布时间:2023/12/17 浏览次数:171 分类:Java

本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map 进行排序,并列出了一些示例代码来理解它。

如何在 Java 中打印 HashMap

发布时间:2023/12/17 浏览次数:192 分类:Java

本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。

在 Java 中更新 Hashmap 的值

发布时间:2023/12/17 浏览次数:146 分类:Java

本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。

Java 中的 hashmap 和 map 之间的区别

发布时间:2023/12/17 浏览次数:79 分类:Java

本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,

在 Java 中获取用户主目录

发布时间:2023/12/17 浏览次数:218 分类:Java

这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。

Java 中 size 和 length 的区别

发布时间:2023/12/17 浏览次数:179 分类:Java

这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。

Java 中的互斥锁

发布时间:2023/12/17 浏览次数:111 分类:Java

了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便