Kotlin:为什么我需要用自定义getter初始化var?

Kotlin:为什么我需要用自定义getter初始化var?,kotlin,Kotlin,为什么我需要用一个返回常量的自定义getter初始化var var greeting: String // Property must be initialized get() = "hello" 当我将问候语设置为只读(val)时,我不需要初始化。当您使用不使用字段标识符访问其值的自定义getter创建val时,不会生成支持字段 val greeting: String get() = "hello" 如果您这样做,则会生成支持字段,需要对其进行初始化 val greeting:

为什么我需要用一个返回常量的自定义getter初始化
var

var greeting: String // Property must be initialized 
get() = "hello"
当我将
问候语设置为只读(
val

时,我不需要初始化。当您使用不使用字段标识符访问其值的自定义getter创建val时,不会生成支持字段

val greeting: String
    get() = "hello"
如果您这样做,则会生成支持字段,需要对其进行初始化

val greeting: String // Property must be initialized
    get() = field
var greeting: String // Property must be initialized
    get() = "hello"
现在使用var。由于默认情况下生成支持文件,因此必须对其进行初始化

val greeting: String // Property must be initialized
    get() = field
var greeting: String // Property must be initialized
    get() = "hello"
为了在不进行初始化的情况下对var起作用,您必须提供一个自定义setter来防止生成支持字段。例如:

var storage: String = ""
var greeting: String
    get() = "hello"
    set(value) { storage = value}

您的代码没有自定义setter,因此它等效于:

var greeting: String
    get() = "hello"
    set(v) {field = v}  // Generated by default
set
的默认实现使用
字段
,因此必须对其进行初始化

根据相同的逻辑,如果
set
get
使用该字段,则不必初始化该字段(这意味着它们都是自定义的):


那你为什么不把它变成
val
呢?每个带有支持字段的可变属性都需要初始化。@miensol同意,这应该是一个
val
。我自己也很困惑;混淆的根源是将
val
/
var
差异看作常数与变量,而不是只读与可变。初始化是什么意思?提供设定器?还是在声明期间提供值?你能确认一下吗?提供一个值。通过显式初始值设定项或在init块内。如果在声明或init块期间未提供任何值。为什么需要同时编写getter和setter?我的意思是,假设我只写set块<代码>变量良好:Int set(value){field=3}
它仍然会显示初始化错误。但是一旦我写了
get()=3
或者其他东西,它就会解决这个错误。背后的原因是什么?
var good:Int set(value){field=3}get()=3
它不工作了,我不知道为什么。但当我删除
field=3
时,它工作正常,初始化错误消失了。与上面的答案相同。请查看支持字段文档的链接。若您使用默认的get/set或在自定义字段中引用字段,则Var将生成支持字段。如果生成了备份字段,则需要对其进行初始化。如果不需要setter,则它应该是
val
属性。