【发布时间】:2021-06-11 03:53:29
【问题描述】:
我有一个由 Spring 管理的 kotlin 类(它是一个 @Service)。它调用非 Spring 管理的对象上的函数。如何将值传递给该函数?
我不想只传递参数给它,因为这个函数是多态的,我只希望这个函数的一个版本使用这个值,这个函数的其他版本不需要这个值。
我通过使用 @Value 注释从属性文件中获取此值。
代码示例:
@Service
class ServiceClass(
private val transactionTemplate: TransactionTemplate,
@Value("\${some-value}")
private val someValue: String
) {
private fun callingPolymorphicFunction(polymorphicObjects: List<PolymorphicObjects>) {
transactionTemplate.execute {
polymorphicObjects.forEach {
it.process()
}
}
}
}
sealed class PolymorphicObjects {
abstract fun process(): AnotherObject?
}
data class PolyMorphicObjectsInheriting1(
//some fields
) : PolymorphicObjects() {
override fun process(): AnotherObject? {
//some code #1
}
}
data class PolyMorphicObjectsInheriting2(
//some other fields
) : PolymorphicObjects() {
override fun process(): AnotherObject? {
//some code #2
}
}
data class PolyMorphicObjectsInheriting3(
//some other fields yet again
) : PolymorphicObjects() {
override fun process(): AnotherObject? {
//some code #3
}
}
我只希望 PolyMorphicObjectsInheriting1::process 能够访问此值而不是其他值,最简单的方法是什么?
tldr:如何在不添加其他参数的情况下将值传递给函数?
【问题讨论】:
-
这里可能存在设计问题,但如果没有您的实际用例,很难在假设情况下提供帮助。似乎对于任何
PolymorphicObjects中的process(),您的值通常不被认为“可能”有用,这可能就是您不想将其作为process()的参数的原因。在这种情况下,我相信多态对象本身应该知道该值,而做到这一点的一种方法是在创建时将其提供给对象。谁创建了这些实例? -
我认为最好重新设计这部分系统,但由于时间限制我还不能这样做。多态对象列表是由系统的其他部分创建的,并且也很难修改它们,因为只有一个 PolyMorphicObjectsInheriting 需要它。如果我可以在没有额外大惊小怪的情况下访问非 Spring 对象中的 Spring 内容(如 @Value 注释),那将是最好的,但我认为这是不可能的。
-
你也可以试试
@Configuration&@ConfigurationProperties
标签: spring spring-boot kotlin