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



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

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。本质上:

  • 有没有一种方法可以在Kotlin中注释捕获的变量
  • 在委派给对象时,是否有方法对字段进行注释

我需要通过注释来做到这一点,因为框架不提供任何其他方式来排除字段,甚至不提供名称。

此外,我说的不是委托属性,而是委托接口。

创建一个命名类:

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 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
}

最新更新