我如何将实现委托给Kotlin中的可变属性?
至于我的理解,在Kotlin中委托一个实现的想法是避免看起来像这样的代码:
class MyClass(val delegate : MyInterface) : MyInterface { override fun myAbstractFun1() = delegate.myAbstractFun1() override fun myAbstractFun2() = delegate.myAbstractFun2() // ... }
相反,我们可以写下面的代码,它应该这样做:
class MyClass(val delegate : MyInterface) : MyInterface by delegate
现在,我想delegate
是一个可变的variables,即我的代码如下所示:
var delegate : MyInterface = MyImplementation() object MyObject : MyInterface by delegate
所以,如果我像第一个例子一样委托每个抽象方法来delegate
自己的delegate
那么改变delegate
的值确实会改变方法的行为。 但是,上面的代码编译为这个Java代码:
public final class MyObject implements MyInterface { public static final MyObject INSTANCE; // $FF: synthetic field private final MyInterface $$delegate_0 = MyObjectKt.access$getDelegate$p(); @NotNull public String myAbstractFun1() { return this.$$delegate_0.myAbstractFun1(); } @NotNull public String myAbstractFun2() { return this.$$delegate_0.myAbstractFun2(); } }
很显然,不是只使用delegate
字段,Kotlin编译器决定在创建MyObject
时将其复制到最后一个字段$$delegate_0
,当我更改delegate
值
有没有更好的解决方案,而不是手动委派每个方法?