为什么使用@singleton 而不是简单地使用对象
Why use @singleton instead using simply object
在 Kotlin 中,object 的常见用途是将其用于单例,例如:
object MyObject {
...
}
但是,在使用micronaut框架时,官方文档推荐使用这样的方式:
@Singleton
class V8Engine : Engine {
override var cylinders = 8
override fun start(): String {
return "Starting V8"
}
}
为什么我不能简单地使用对象而不是使用带有 class 的注释 @Singleton?
有了@Singleton
,Micronaut 可以自动管理bean 之间的依赖关系。如果你在 https://docs.micronaut.io/latest/guide/ioc.html#beans 中使用另一个 class,翻译成 Kotlin:
@Singleton
class Vehicle(private val engine: Engine) {
public fun start() = engine.start()
}
它不能只是一个 object
因为需要一个参数。
这个参数被 Micronaut 发现是 V8Engine
的单例实例,需要 that 是 @Singleton
并且不是 object
.
当然,在这种情况下你可以直接在Vehicle
中使用V8Engine
;但更容易改变例如如果你不想Engine
不再是单身人士。
Why can't I use simply object instead of using annotation @Singleton
with a class?
您可以使用对象而不是将 @Singleton
与 class 一起使用。 Micronaut 不会为您管理实例,但这是允许的。
在 Kotlin 中,object 的常见用途是将其用于单例,例如:
object MyObject {
...
}
但是,在使用micronaut框架时,官方文档推荐使用这样的方式:
@Singleton
class V8Engine : Engine {
override var cylinders = 8
override fun start(): String {
return "Starting V8"
}
}
为什么我不能简单地使用对象而不是使用带有 class 的注释 @Singleton?
有了@Singleton
,Micronaut 可以自动管理bean 之间的依赖关系。如果你在 https://docs.micronaut.io/latest/guide/ioc.html#beans 中使用另一个 class,翻译成 Kotlin:
@Singleton
class Vehicle(private val engine: Engine) {
public fun start() = engine.start()
}
它不能只是一个
object
因为需要一个参数。这个参数被 Micronaut 发现是
V8Engine
的单例实例,需要 that 是@Singleton
并且不是object
.
当然,在这种情况下你可以直接在Vehicle
中使用V8Engine
;但更容易改变例如如果你不想Engine
不再是单身人士。
Why can't I use simply object instead of using annotation @Singleton with a class?
您可以使用对象而不是将 @Singleton
与 class 一起使用。 Micronaut 不会为您管理实例,但这是允许的。