Kotlin 为什么使用@singleton而不是简单地使用object
在Kotlin中,对象的一个常见用法是将其用于单例,如:Kotlin 为什么使用@singleton而不是简单地使用object,kotlin,micronaut,Kotlin,Micronaut,在Kotlin中,对象的一个常见用法是将其用于单例,如: object MyObject { ... } 但是,在使用micronaut框架时,官方文档建议使用以下内容: @Singleton class V8Engine : Engine { override var cylinders = 8 override fun start(): String { return "Starting V8" } } 为什么我不能简单地使用object而不是使用annota
object MyObject {
...
}
但是,在使用micronaut框架时,官方文档建议使用以下内容:
@Singleton
class V8Engine : Engine {
override var cylinders = 8
override fun start(): String {
return "Starting V8"
}
}
为什么我不能简单地使用object而不是使用annotation@Singleton和一个类呢?因为如果你打算使用一些DI框架,那么让它控制和管理你的bean的生命周期,而不是自己做事情是有意义的。尽管object和@Singleton都可以有效地创建一个Singleton对象,但在创建的方式和时间上可能有很大的不同 如果手动创建对象,则可以主动创建对象,也就是说,在加载程序时将分配对象,但在满足特殊条件之前,可能不需要这些对象 另一方面,DI框架可以应用许多无法手动完成的优化
PS:我并不是说手动bean管理不是一件好事,但它只适用于一些非常特定的用例,在这种情况下,您最好首先不用任何DI,使用
@Singleton
,Micronaut可以自动管理bean之间的依赖关系。如果您与中的其他类一起使用,请翻译为Kotlin:
@Singleton
class Vehicle(private val engine: Engine) {
public fun start() = engine.start()
}
对象
,因为它需要一个参数V8Engine
的单例实例,它需要是@singleton
而不是对象
Vehicle
中的V8Engine
;但是,如果您希望引擎
不再是单身汉,则更容易进行更改
为什么我不能使用simply object而不是annotation@Singleton
有课吗
您可以对类使用object而不是
@Singleton
。Micronaut不会为您管理实例,但这是允许的。Kotlin对象是惰性的,因此除非调用,否则不会分配它们。我还希望DI框架的优化程度低于手动编写等效代码。折衷是您需要编写和更改更少的代码。