如何在 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
。
本质上:
- 有没有办法在 Kotlin 中注释捕获的变量?
- 有没有办法在委托给对象时对字段进行注释?
我需要通过注释来执行此操作,因为框架不提供任何其他方式来排除字段,甚至不提供名称。
此外,我不是在谈论委托属性,而是在谈论委托接口。
创建一个名为 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
}
我想通过将现有 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
。
本质上:
- 有没有办法在 Kotlin 中注释捕获的变量?
- 有没有办法在委托给对象时对字段进行注释?
我需要通过注释来执行此操作,因为框架不提供任何其他方式来排除字段,甚至不提供名称。
此外,我不是在谈论委托属性,而是在谈论委托接口。
创建一个名为 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
}