Kotlin – 了解吸气者和安慰者

Kotlin自动生成它的getters和设置,但我从来没有提到他们? 另外,在Kotlin编写自定义getter / setter的正确方法是什么? 当我说myObj.myVar = 99我觉得myVar是我直接访问的myObj的公共字段? 这里究竟发生了什么?

这已经在一些地方得到了回答,但是我认为我会分享一个从Java / C#/ C / C ++过渡到Kotlin的人的具体例子,他们也有同样的问题:

我很难理解getter和setter在Kotlin中是如何工作的,特别是他们从来没有被明确的调用(就像他们在Java中一样)。 正因为如此,我感到不舒服,因为它看起来像我们只是直接把瓦尔/瓦尔当作田野。 因此,我列出了一个小实验来证明事实并非如此,实际上它是在访问变量/值时在Kotlin中调用的隐式(自动生成的)或显式的getter / setter。 不同的是,你不明确要求默认的getter / setter。

从文档 – 声明属性的完整语法是:

 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" } 

我希望这有助于为其他人整合在一起?