在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?
答案 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()
}
它不能只是一个object
,因为需要一个参数。
Micronaut发现此参数是V8Engine
的单例实例,需要 that 是@Singleton
而不是object
当然,在这种情况下,您可以直接在V8Engine
中使用Vehicle
;但更容易更改,例如如果您希望Engine
不再是单身人士。
答案 1 :(得分:0)
为什么我不能只使用对象而不是使用注释@Singleton 上课吗?
您可以使用对象而不是对类使用@Singleton
。 Micronaut不会为您管理实例,但这是允许的。
答案 2 :(得分:-1)
因为如果要使用一些DI框架,那么让它控制和管理bean的生命周期是有意义的,而不是自己做。即使object和@Singleton都可以有效地创建一个单例对象,其完成方式和完成时间也可能有很多差异。
如果手动执行操作,则可以主动创建对象,即在加载程序时将分配它们,但是在满足特殊条件之前可能不需要这些对象。
另一方面,DI框架可以应用许多无法手动完成的优化。
PS:我并不是说手动Bean管理不是一件好事,但它仅适用于某些非常特殊的用例,在这种情况下,您最好不用任何DI即可