Назад к вопросам
Middle
101
questionbank

Когда следует использовать '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 для свойств, которые затратны в создании или могут не понадобиться в течение всего времени жизни объекта, или когда инициализацию нужно отложить до момента первого фактического использования.