В этой Android CodeLab они создали такой сервис Retrofit:
object MarsApi {
val retrofitService : MarsApiService by lazy {
retrofit.create(MarsApiService::class.java) }
}
Здесь MarsApi — это синглтон, а насколько я знаю, в Kotlin синглтоны лениво инициализируются по определению.
Итак, почему нам нужно использовать здесь «ленивые»? Мне кажется, что концепция ленивой инициализации применяется в данном случае 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
.