Когда следует использовать 'lateinit' и 'by lazy' в Kotlin?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech 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)
// Теперь binding можно использовать
}
}
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 для свойств, которые затратны в создании или могут не понадобиться в течение всего времени жизни объекта, или когда инициализацию нужно отложить до момента первого фактического использования.