当前位置: 首页 > 知识库问答 >
问题:

在Kotlin中使用get()有什么区别

龚奕
2023-03-14

我想了解这两种说法在更深层次上的区别是什么。

val myVariable: String get() = activity.myName
val myVariable: String = activity.myName

即使我能够从其他类中访问这些变量,并且对我来说两者的工作方式相同,但是< code>get()又有什么不同呢?

共有1个答案

司空劲
2023-03-14

如果您将get() = 移到下一行,将有助于更好地理解它。

val myVariable: String 
    get() = activity.myName

因为你会发现你也可以这样做:

val myVariable: String = "something"
    get() = activity.myName

当你定义一个属性时,有两件事情正在发生。

>

  • = “某事”= 活动 .myName 紧跟在属性名称和类型之后,是支持字段初始值设定项。包含此内容时,将为属性提供一个后备字段,该字段是一个不可见的变量,可以保存供属性使用的数据,并且表达式用于定义要在支持字段中保留的初始值。

    使用<code>get()

    您不能同时省略字段和自定义 getter,因为这样您将有一个没有要检索的支持字段的默认 getter,这毫无意义。

    现在我们可以解释三种可能的写入该属性的方法:

    val myProperty: String 
        get() = activity.myName
    // Every time you use this property, it looks up the activity property and finds the
    // value of the activity's myName property. So if activity was changed to point to
    // something else or myName was changed to point to something else, myProperty will
    // always return the latest value when it is used.
    
    val myProperty: String = activity.myName
    // This property is initialized with the value that activity.myName holds at the time
    // the class is instantiated, and it will always return this same original value even
    // if activity or myName changes, because the value of the backing field is never changed.
    // The value of the backing field can only be changed if you're using a var property.
    
    val myProperty: String = activity.myName
        get() = activity.myName
    // This property behaves like the first one above, but it also has a useless backing
    // field that is holding a reference to the original value of activity.myName. Since
    // the custom getter doesn't use the backing field, the backing field can never be
    // read, so it's useless.
    

    下面是同时使用后备字段和自定义 getter 的一个可能的用例。如果要像上面的第二个示例那样在后备字段中保留一个常量值,但有一些副作用,例如每次访问时都记录某些内容,则可以同时使用这两种方法。关键字字段可以在自定义 getter 中使用以访问支持字段。

    val myProperty: String = activity.myName
        get() = field.also { Log.i(TAG, "Retrieved value of myProperty.") }
    

  •  类似资料:
    • 本文向大家介绍Kotlin与Scala有什么区别,包括了Kotlin与Scala有什么区别的使用技巧和注意事项,需要的朋友参考一下 Scala比Kotlin更好吗?不...,Kotlin胜过Scala吗?没有... 两种编程语言都有其自身的优势,并且可以用于一组特定的开发。只是有些开发人员认为Java不足以开发他们设计Kotlin的应用程序,而其他开发人员则认为Java库在他们设计Scala时无法

    • 使用spring boot与Kotlin和Java有什么区别? Kotlin是你可以选择用https://start.spring.io启动应用的三种语言之一,所以它得到了spring boot团队的支持。我用它来开发一些微服务,据我所知,最后一切都很好,但我想从其他开发者那里得到一些反馈,因为我试图说服我的新团队在科特林开始我们的新微服务。 赞成的意见: 空安全 更清晰的代码 Val超过var

    • 问题内容: 使用该工具一段时间后,它看起来像: (可选)下载, 编译, 并安装 一个软件,而仅仅是 编译 并安装 它。在这种情况下,为什么该命令被取代而存在? 问题答案: 是本地工作时工作流程的一部分。假设您要使用库,但是由于某些原因需要进行更改。您可以这样做: ,仅下载该文件; 对下载的软件包进行更改; 安装本地版本。 据我知道有没有标志,以表明它应该 不 下载,所以它不能代替在这里。 从头开始

    • 如果为null,则上面的代码将抛出。所以我得包支票。 那么在这种情况下,什么是最佳实践呢?nullable有什么用?

    • Kotlin中的和有什么区别? 如本链接所述: 只读属性声明的完整语法与可变属性声明的不同之处在于两个方面:它以val而不是var开头,并且不允许setter。 但就在前面有一个使用setter的示例。 为什么我们两者都需要? 这不是Kotlin中变量的重复,与Java的区别:“var”vs.“val”?因为我询问的是与文档中的特定示例相关的疑问,而不仅仅是一般性的疑问。

    • Gradle(5.0)中有两种创建方法,即任务: 和 基本一样的API,那么有什么区别呢?