为什么使用@singleton而不是仅使用对象

时间:2019-12-18 16:56:39

标签: kotlin micronaut

在Kotlin中, object 的常见用法是将其用于单例,例如:

const
    opc = ['A', 'B', 'C', 'D'],
    val = [true, false, false, false],
    result = Object
        .entries({ opc, val })
        .reduce((r, [k, a]) => a.map((v, i) => Object.assign(r[i] || {}, { [k]: v })), []);

console.log(result);

但是,在使用micronaut框架时,官方文档建议使用以下内容:

object MyObject {
   ...
}

为什么不能只使用对象而不是对类使用批注@Singleton?

3 个答案:

答案 0 :(得分:2)

使用@Singleton,Micronaut可以自动管理bean之间的依赖关系。如果您与https://docs.micronaut.io/latest/guide/ioc.html#beans中的其他课程一起学习,请翻译为Kotlin:

@Singleton
class Vehicle(private val engine: Engine) {
    public fun start() = engine.start()
}
  1. 它不能只是一个object,因为需要一个参数。

  2. Micronaut发现此参数是V8Engine的单例实例,需要 that @Singleton而不是object

当然,在这种情况下,您可以直接在V8Engine中使用Vehicle;但更容易更改,例如如果您希望Engine不再是单身人士。

答案 1 :(得分:0)

  

为什么我不能只使用对象而不是使用注释@Singleton   上课吗?

您可以使用对象而不是对类使用@Singleton。 Micronaut不会为您管理实例,但这是允许的。

答案 2 :(得分:-1)

因为如果要使用一些DI框架,那么让它控制和管理bean的生命周期是有意义的,而不是自己做。即使object和@Singleton都可以有效地创建一个单例对象,其完成方式和完成时间也可能有很多差异。

如果手动执行操作,则可以主动创建对象,即在加载程序时将分配它们,但是在满足特殊条件之前可能不需要这些对象。

另一方面,DI框架可以应用许多无法手动完成的优化。

PS:我并不是说手动Bean管理不是一件好事,但它仅适用于某些非常特殊的用例,在这种情况下,您最好不用任何DI即可