kotlin - 在 Android 中创建改造服务的正确方法?
问题描述
在这个 Android CodeLab中,他们创建了一个改造服务,如下所示:
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
orvar
属性也不是。最重要的是,您可以更改这些属性的行为方式。
现在,另一方面,您将无法执行此操作:
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
。
推荐阅读
- visual-studio-code - 企业防火墙后面的 VSCode,扩展显示“安装失败”
- jenkins - Jenkins TestComplete 从 Jira 获取测试执行 ID
- asp.net-web-api - 检测到与 ASP.NET SignalR 服务器的连接尝试
- javascript - 如何在Javascript的Script Tag中动态访问JSP的forEach标签值。?
- javascript - 将来自 ajax 响应的数据填充到下拉列表中
- python-3.x - 如何在pymqi中控制UserID?
- php - URL重写和重定向地址错误
- javascript - 如何使用 Vuetify.js 制作多页 Web 应用程序?
- row - Python读取多行并将它们写入ASCII文件中的一行
- csv - 文件 A 的输出行,其中第一列与文件 B 匹配