考虑一下这个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 }
如果此实例是isParent
实例,则假设true
返回parent
。如果不是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 }
然而,这不起作用,不幸的是它使代码的可读性降低。特别是如果你有很多这样的变量,它们绑定到这个parent
。
答案 0 :(得分:1)
属性的支持字段只能从该属性的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 }
}