如何在 Kotlin 中为捕获的变量或委托对象添加注释?

How to add annotations to captured variables or delegated objects in Kotlin?

我想通过将现有 class 扩展为匿名对象来动态实现接口。 这个匿名对象捕获一个方法参数来实现接口方法:

fun myFunc(someObj: SomeObj, update: Boolean) = object : SomeObj(/*copy some values from someObj*/), SomeInterface {
   override fun doUpdate() = update
}

此实现捕获 update 方法参数并将其作为合成 $update 字段添加到匿名对象中。我需要注释此字段,因为我的序列化框架在未标记为 @Transient.

时包含 $update 字段

委托的另一种方法也存在同样的问题:

fun myFunc(someObj: SomeObj, update: Boolean) {
   val someInterfaceImpl = object : SomeInterface {
      override fun doUpdate() = update
   }
   return object : SomeObj(/*copy some values from someObj*/), SomeInterface by someInterfaceImpl 
}

我无法在任何地方用@delegate:Transient@Transient注释someInterfaceImpl。 本质上:

我需要通过注释来执行此操作,因为框架不提供任何其他方式来排除字段,甚至不提供名称。

此外,我不是在谈论委托属性,而是在谈论委托接口。

创建一个名为 class:

fun myFunc(someObj: SomeObj, update: Boolean): SomeObj {
    class SomeObjSubclass(someObj: SomeObj, @Transient val update: Boolean):
        SomeObj(someObj.prop1, someObj.prop2, /* and so on*/), SomeInterface {
        override fun doUpdate() = update
    }
    return SomeObjSubclass(someObj, update)
}

请注意 myFunc 现在只是 SomeObj 的包装。根据您的设计,您可以将 myFunc 改为 SomeObj 子 class:

class MyFunc(someObj: SomeObj, @Transient val update: Boolean):
        SomeObj(someObj.prop1, someObj.prop2, /* and so on*/), SomeInterface {
    override fun doUpdate() = update
}

调用者会像调用函数一样调用 MyFunc(...),他们会像以前一样收到可分配给 SomeObj 的内容。

您还可以向 SomeObj 添加一个带有 SomeObj 的辅助构造函数,然后将属性复制到那里

constructor(someObj: SomeObj): this(
    someObj.prop1, someObj.prop2, /* and so on */
)

那么MyFunc的声明可以是:

class MyFunc(someObj: SomeObj, @Transient val update: Boolean):
        SomeObj(someObj), SomeInterface {
    override fun doUpdate() = update
}