Sobes.tech
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 за свойства, които са скъпи за създаване или може да не са необходими през цялото време на живота на обекта, или когато искате да отложите инициализацията до първото реално използване.