Middle
Кай вақт бояд дар Kotlin 'lateinit' ва 'by lazy' истифода баред?
sobes.tech AI
Ҷавоб аз AI
lateinit истифода мешавад барои хусусиятҳои non-nullable, ки баъдтар, пеш аз аввалин дастрасӣ ба онҳо оғоз меёбанд. Бо var истифода мешавад.
class UserActivity : AppCompatActivity() {
lateinit var binding: ActivityUserBinding // Дар onCreate оғоз меёбад
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
// Акнун метавон истифода бурд
}
}
by lazy барои хусусиятҳои non-nullable ё nullable истифода мешавад, ки дар аввалин дастрасӣ оғоз меёбанд. Бо val истифода мешавад.
class DataManager {
val apiService: ApiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
Муҳокима:
| Хусусият | lateinit |
by lazy |
|---|---|---|
| Истифода | var |
val |
| Навъи хусусият | Non-nullable | Non-nullable ё nullable |
| Инициализация | Касе, дастӣ | Дар аввалин дастрасӣ, автоматӣ |
| Бехатарии сӯнҳо | Гарантӣ нест (агар дастӣ синхронӣ нашуда бошад) | Гарантӣ дорад (синхронӣ шудааст) |
| Арзиши нол | Иҷозат намедиҳад пеш аз инициализация (истисно меандозад) | Не (навъи муайян мешавад бо инициализатор) |
Истифода баред lateinit, вақте ки арзиши хусусият аз контекст ё дигар омилҳо вобаста аст ва бояд пас аз сохтани объект, аммо пеш аз истифодаи он таъин карда шавад (масалан, дар пайваст кардани View дар Android Activity).
Истифода баред by lazy барои хусусиятҳое, ки гарон ҳастанд дар сохтмон ё метавонанд дар тӯли тамоми умри объект заруранд, ё вақте ки мехоҳед инициализатсияро то истифодаи аввал таъхир кунед.