为什么使用@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()
}
  1. 它不能只是一个 object 因为需要一个参数。

  2. 这个参数被 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 不会为您管理实例,但这是允许的。