【问题标题】:Good way to pass value into a function without passing it directly as parameter将值传递给函数而不直接作为参数传递的好方法
【发布时间】: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


【解决方案1】:

听起来像是设计问题,但您可以在 ServiceClass 中创建公共静态变量,并在 @PostConstruct 注释方法中将其设置为等于 someValue 并在 prcoess(..) 方法中调用

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多