java - Kotlin 委托(delegate)表达而不是固定引用

标签 java delegates kotlin

假设我有一个定义为接口(interface)的非常复杂的规范:

interface Spec {
    fun sayHello()
}

还有一个标准的实现:

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

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

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

上面例子的问题是构造函数调用时构造函数参数target被设置为委托(delegate)对象。然后类直接访问委托(delegate),而不是执行属性访问。 (这已通过查看 Kotlin 生成的字节码得到证实。)

所以,即使在构造类之后修改了属性target,委托(delegate)也不会改变。

任何人都可以提供一种在 Kotlin 中执行此委托(delegate)的方法,而无需编写每个方法吗?

理想的解决方案还允许委托(delegate)给像 lambda 或其他表达式这样通用的东西,只要在对象的整个生命周期中需要委托(delegate),就可以评估并用作委托(delegate)。

最佳答案

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

Currenlty Kotlin evaluates expression for delegate in class initializer

关于java - Kotlin 委托(delegate)表达而不是固定引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36993654/

相关文章:

java - Spring boot devtools 和 ActiveJDBC 集成

ios - "Destroying"委托(delegate)后退按钮(或滑动)[UINavigationController]

将多个 ViewController 推送到 NavigationController 堆栈时的 iOS 委托(delegate)问题

android - 如何在 Kotlin 中注入(inject)原始变量?

generics - Kotlin 泛型类重载?

java - 指定属性文件的 Java 路径

java - ListView 与应用程序栏重叠 - Android

java - 在 Java 代码中使用 kotlin 库

java - 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

objective-c - 使用 objective-c 中的类别私下扩展协议(protocol)