Sobes.tech
Middle

Kiedy należy używać 'lateinit' i 'by lazy' w Kotlin?

sobes.tech AI

Odpowiedź od AI

lateinit jest używany dla właściwości nie-nullowalnych, które będą inicjalizowane później, przed pierwszym dostępem do nich. Stosuje się go z var.

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Będzie zainicjalizowane w onCreate

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Teraz można używać binding
    }
}

by lazy jest używany dla właściwości nie-nullowalnych lub nullable, które są inicjalizowane przy pierwszym dostępie. Stosuje się go z val.

class DataManager {
    val apiService: ApiService by lazy {
        Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

Porównanie:

Cecha lateinit by lazy
Zastosowanie var val
Typ właściwości Nie-nullowalny Nie-nullowalny lub nullable
Inicjalizacja Późna, ręczna Przy pierwszym dostępie, automatyczna
Bezpieczeństwo wątków Nie gwarantowane domyślnie (jeśli nie zsynchronizowane ręcznie) Gwarantowane domyślnie (zsynchronizowane)
Wartość null Niedozwolona przed inicjalizacją (wyrzuci wyjątek) Nie (typ określa inicjalizator)

Używaj lateinit, gdy wartość właściwości zależy od kontekstu lub innych czynników i musi być ustawiona po utworzeniu obiektu, ale przed jego użyciem (np. podczas wiązania widoków w Android Activity).

Używaj by lazy dla właściwości, które są kosztowne w tworzeniu lub mogą nie być potrzebne przez cały czas życia obiektu, lub gdy chcesz opóźnić inicjalizację do momentu pierwszego faktycznego użycia.