Middle
Кога трябва да използвате 'lateinit' и 'by lazy' в Kotlin?
sobes.tech AI
Отговор от AI
lateinit се използва за свойства, които не са нулеви, и ще бъдат инициализирани по-късно, преди първия им достъп. Приложим е с var.
class UserActivity : AppCompatActivity() {
lateinit var binding: ActivityUserBinding // Ще бъде инициализирано в onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
// Сега може да се използва binding
}
}
by lazy се използва за свойства, които са не-null или 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 |
| Тип на свойството | Не-nullable | Не-nullable или nullable |
| Инициализация | По-късно, ръчно | При първи достъп, автоматично |
| Безопасност при нишки | Не е гарантирано по подразбиране (ако не е синхронизирано ръчно) | Гарантирано по подразбиране (синхронизирано) |
| Нулева стойност | Не е разрешена преди инициализация (ще хвърли изключение) | Не (типът се определя от инициализатора) |
Използвайте lateinit, когато стойността на свойството зависи от контекста или други фактори и трябва да бъде зададена след създаването на обекта, но преди използването му (например, при свързване на View в Android Activity).
Използвайте by lazy за свойства, които са скъпи за създаване или може да не са необходими през цялото време на живота на обекта, или когато искате да отложите инициализацията до първото реално използване.