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

时间:2017-05-19 19:54:34

标签: 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 }

如果此实例是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

1 个答案:

答案 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 }
 }