繁体   English   中英

Kotlin Var和Val Getter和Setter问题

[英]Kotlin Var and Val Getter and Setter Problem

我是 Kotlin 编程语言的新手。 (Java -> 科特林)

var x
    get()= 4; // Showing error Property must be initialized

val y
    get()= 4; // No error

为什么会这样?

val y = 4是一个val ,这意味着它是只读的 您用来初始化它的值4存储在支持字段中 存储该变量值的 memory 位。

var y = 4是一个var ,这意味着您可以写入它 同样,有一个存储当前值的支持字段——只是您现在可以更改它。


这可能是您习惯的所有内容 - 但 Kotlin 还允许您定义getter 和 setter 函数,具体取决于它是val (仅 getter)还是var 实际上,默认的 getter 和 setter 已经存在——它们只是读取和写入支持字段。 如果您不定义自己的,它只会使用那些。

val y get() = 4是一个val ,这意味着它是只读的 因为您添加了一个 getter function,所以4值实际上并未存储在支持字段中 - 因此 Kotlin 不会创建一个。 没有什么可以用值初始化的。

var y get() = 4是一个var ,所以你可以设置它。 您尚未在此处定义设置器 function,因此它使用隐式默认设置器,它写入支持字段。

这就是您的问题所在 - Kotlin 如果不需要,则不会创建支持字段:

// stores any value passed to the setter in the variable's backing field
var something
    get() = "hi"
    set(value) { field = value }

// does nothing with the setter value, no field is used anywhere, so it doesn't create one
var somethingElse
    get() = "hi"
    set(value) { }

(这不是一个很好的例子,因为通常你不会有一个带有 setter 的固定值,因为这有什么意义?但是你可以有一个 getter/setter 对来存储和读取 map 之类的东西,这不是'不需要支持字段,因为它正在其他地方获取和存储数据)


因此,当您执行var y get() = 4时,您实际上是在这样做:

var y
    get() = 4
    set(value) { field = value } // default setter

这就是通过 setter 创建一个支持字段。 该字段需要有一些初始值,Kotlin 不像 Java 那样。 事情可以保留未分配并默认为一个值。

所以你只需要分配一个值:

var y = 1
    get() = 4

现在你的支持字段有一个值,所以编译器很高兴。 你从来没有真正读过它,所以它是无用的,这是一个你根本不需要var的好兆头!

查看属性文档,它解释了所有这些内容(以及其他一些关于可见性等的内容),但希望这是有道理的,并且您会明白为什么您的示例实际上有点奇怪以及您应该避免的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM