首页 > 解决方案 > 在 Android 中创建改造服务的正确方法?

问题描述

这个 Android CodeLab中,他们创建了一个改造服务,如下所示:

object MarsApi {
    val retrofitService : MarsApiService by lazy { 
       retrofit.create(MarsApiService::class.java) }
}

在这里,MarsApi 是一个单例,据我所知,在 Kotlin 中,单例是按定义延迟初始化的。

那么为什么我们需要在这里使用“by lazy”呢?在我看来,在这种情况下,惰性初始化概念被应用了 2 次。

标签: kotlinsingletonretrofitlazy-initialization

解决方案


这是一种思考方式。

object MarsApi1 {
    var count = 0
    val str: String
    get(){
        count++
        return "$count"
    }
}

fun main() {
  println(MarsApi1.str)
  println(MarsApi1.str)
}

正如您在此处看到的,即使 MarsApi1 是单例并且被延迟初始化,valorvar属性也不是。最重要的是,您可以更改这些属性的行为方式。

现在,另一方面,您将无法执行此操作:

object MarsApi2 {
    var count = 0
    val str : String by lazy {
        "saiful103a" }
        get(){
            count++
            return "$count"
        }
}

fun main() {
  println(MarsApi2.str)
  println(MarsApi2.str)
}

有了这个,你会得到,Delegated property cannot have accessors with non-default implementations错误。无论您想提供什么实现,您都必须将它们放在lazy块内。

最后:

object MarsApi2 {
    var count = 0
    val str : String by lazy {
        count++;"$count" }
}

fun main() {
  println(MarsApi2.str)
  println(MarsApi2.str)
}

为此,您每次访问时都会获得相同的值MarsApi2.str


推荐阅读