Kotlin 自动生成它的 getter 和设置,但我从不引用它们?另外,在 Kotlin 中编写自定义 getter/setter 的正确方法是什么?当我说myObj.myVar = 99
我感到myVar
是一个公共领域myObj
我直接访问?这里到底发生了什么?
这个问题已经在一些地方得到了回答,但我想我应该为那些从 Java/C#/C/C++ 过渡到 Kotlin 的人分享一个具体的例子,他们和我有同样的问题:
我很难理解 Kotlin 中的 getter 和 setter 是如何工作的,特别是因为它们从未被显式调用(就像在 Java 中一样)。因此,我感到不舒服,因为看起来我们只是直接将 vars/vals 引用为字段。因此,我做了一个小实验来证明情况并非如此,事实上,当您访问变量/值时,Kotlin 中会调用隐式(自动生成)或显式 getter/setter。不同之处在于,您没有明确要求默认的 getter/setter。
来自文档 https://kotlinlang.org/docs/reference/properties.html- 声明属性的完整语法是:
var <propertyName>: <PropertyType> [= <property_initializer>]
[<getter>]
[<setter>]
我的例子是
class modifiersEg {
/** this will not compile unless:
* - we assign a default here
* - init it in the (or all, if multiple) constructor
* - insert the lateinit keyword */
var someNum: Int?
var someStr0: String = "hello"
var someStr1: String = "hello"
get() = field // field is actually this.someStr1, and 'this' is your class/obj instance
set(value) { field = value }
// kotlin actually creates the same setters and getters for someStr0
// as we explicitly created for someStr1
var someStr2: String? = "inital val"
set(value) { field = "ignore you" }
var someStr3: String = "inital val"
get() = "you'll never know what this var actually contains"
init {
someNum = 0
println(someStr2) // should print "inital val"
someStr2 = "blah blah blah"
println(someStr2) // should print "ignore you"
println(someStr3) // should print "you'll never know what this var actually contains"
}
我希望这有助于其他人将所有内容整合在一起?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)