【发布时间】:2017-10-20 01:23:26
【问题描述】:
考虑一下这个 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。
【问题讨论】:
-
你考虑过使用backing property吗?据我所知,Kotlin 不允许绕过自定义 getter。以前是这样,但现在不是了。
-
为什么
parent和isParent在getter 上互相调用?这应该会导致无限递归问题 -
@voddan 这可能是真的,我仍在理论上进行实验。这应该如何正确完成?
-
不幸的是,我不知道这段代码应该做什么。我可以改进一些位,但整体算法包含错误,所以我无法理解它是如何工作的。尝试包含一个单元测试,让我能够验证代码的行为。
标签: kotlin