Kotlin代表团表达而不是固定参考

时间:2016-05-03 00:22:03

标签: java delegates kotlin

假设我将一个非常复杂的规范定义为接口:

interface Spec {
    fun sayHello()
}

标准实施:

class Impl(private val msg: String) : Spec {
    override fun sayHello() {
        println(msg)
    }
}

现在假设我想创建一个实现此规范并委托给实现的类,但确切的委托对象在整个对象的生命周期中是可变的。这是一个例子:

class Derived(var target: Spec) : Spec by target

上面示例的问题在于,在调用构造函数时,构造函数参数target被设置为委托对象。然后,类直接访问该委托,而不是执行属性访问。 (通过查看Kotlin生成的字节码可以确认这一点。)

因此,即使在构造类之后修改了属性target,代理也不会改变。

任何人都可以提供在Kotlin执行此委派的方法,而无需写出每一种方法吗?

理想的解决方案还允许委派给一些像lambda或其他表达式一般的东西,只要在对象的整个生命周期中需要委托时,它就会被评估并用作委托。

2 个答案:

答案 0 :(得分:6)

现在没有办法做到这一点。见Kotlin issue KT-5870

  

Currenlty Kotlin在类初始值设定项

中评估委托的表达式

答案 1 :(得分:0)

您可以添加间接级别:

"/Dev%d/PFI%d"

不幸的是class Holder(var impl: Spec) : Spec { override fun sayHello() = impl.sayHello() } class Derived(target: Spec, private val holder: Holder = Holder(target)) : Spec by holder { fun changeTarget(newTarget: Spec) { holder.impl = newTarget } } 必须是构造函数参数才能与委托构造一起使用(对于Kotlin v1.0),因此它会使主构造函数复杂化。