我想了解这两种说法在更深层次上的区别是什么。
val myVariable: String get() = activity.myName
val myVariable: String = activity.myName
即使我能够从其他类中访问这些变量,并且对我来说两者的工作方式相同,但是< code>get()又有什么不同呢?
如果您将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,那么有什么区别呢?