在Kotlin中访问同一类的不同实例的字段

考虑这个Kotlin代码:

var parent: T? = null get() = if (isParent) this as T else field set(value) { field = if (value == null) null else value.parent } val isParent: Boolean get() = parent == null var description = "" get() = if (isParent) field else parent!!.description set(value) { if (isParent) field = value else parent!!.description = value } 

假设这个实例是一个parent实例,那么isParent返回true 。 如果不是getParent()将返回父实例。 在Java中,您可以直接访问同一个类的不同实例的字段,如下所示:

 String getDescription() { return getParent().description; } void setDescription(String value) { getParent().description = value; } 

(我不是说这是最好的事情,我简化了它的演示)。 与Java相比,能够做到以下几点是很好的:

 var description = "" get() = parent.field set(value) { parent.field = value } 

然而,这不起作用,不幸的是,它使得代码更不可读。 特别是如果你有很多这样的variables,这是绑定到这个parent

属性的后台字段只能从该属性的getter或setter访问,并且只能用于调用getter或setter的实例。 如果您需要提供多种方式来访问某个类的属性,则需要定义两个不同的属性,其中一个属性具有用于存储数据的后台字段,另一个属性指向第一个属性的getter和setter。

 class Foo { var parent: Foo? = null val parentOrSelf: Foo get() = parent ?: this private var _description: String? = null var description = "" get() = parentOrSelf._description set(value) { parentOrSelf._description = value } }