在 Android 中创建 Retrofit 服务的正确方法?
The proper way to create a Retrofit service in Android?
在 this Android CodeLab 中,他们创建了这样的 Retrofit 服务:
object MarsApi {
val retrofitService : MarsApiService by lazy {
retrofit.create(MarsApiService::class.java) }
}
在这里,MarsApi 是一个单例,据我所知,在 Kotlin 中,单例是根据定义延迟初始化的。
那么这里为什么要用“by lazy”呢?在我看来,惰性初始化概念在这种情况下应用了 2 次。
这是一种思考方式。
object MarsApi1 {
var count = 0
val str: String
get(){
count++
return "$count"
}
}
fun main() {
println(MarsApi1.str)
println(MarsApi1.str)
}
正如您在此处看到的,即使 MarsApi1 是单例并且延迟初始化,val
或 var
属性也不是。最重要的是,您可以更改这些属性的行为方式。
现在,另一方面,您将无法执行此操作:
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
时都会得到相同的值。
在 this Android CodeLab 中,他们创建了这样的 Retrofit 服务:
object MarsApi {
val retrofitService : MarsApiService by lazy {
retrofit.create(MarsApiService::class.java) }
}
在这里,MarsApi 是一个单例,据我所知,在 Kotlin 中,单例是根据定义延迟初始化的。
那么这里为什么要用“by lazy”呢?在我看来,惰性初始化概念在这种情况下应用了 2 次。
这是一种思考方式。
object MarsApi1 {
var count = 0
val str: String
get(){
count++
return "$count"
}
}
fun main() {
println(MarsApi1.str)
println(MarsApi1.str)
}
正如您在此处看到的,即使 MarsApi1 是单例并且延迟初始化,val
或 var
属性也不是。最重要的是,您可以更改这些属性的行为方式。
现在,另一方面,您将无法执行此操作:
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
时都会得到相同的值。