Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 为什么使用@singleton而不是简单地使用object_Kotlin_Micronaut - Fatal编程技术网

Kotlin 为什么使用@singleton而不是简单地使用object

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

在Kotlin中,对象的一个常见用法是将其用于单例,如:

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()
}
  • 它不能只是一个
    对象
    ,因为它需要一个参数

  • Micronaut发现该参数是
    V8Engine
    的单例实例,它需要是
    @singleton
    而不是
    对象

  • 当然,在这种情况下,您可以直接使用
    Vehicle
    中的
    V8Engine
    ;但是,如果您希望
    引擎
    不再是单身汉,则更容易进行更改

    为什么我不能使用simply object而不是annotation@Singleton 有课吗


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

    Kotlin对象是惰性的,因此除非调用,否则不会分配它们。我还希望DI框架的优化程度低于手动编写等效代码。折衷是您需要编写和更改更少的代码。