【问题标题】:The proper way to create a Retrofit service in Android?在 Android 中创建改造服务的正确方法?
【发布时间】:2020-12-25 08:28:30
【问题描述】:

this Android CodeLab 中,他们创建了这样的改造服务:

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

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

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

【问题讨论】:

    标签: kotlin singleton retrofit lazy-initialization


    【解决方案1】:

    这是一种思考方式。

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

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

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

    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时都会得到相同的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多