Sobes.tech
Middle

Care este diferența dintre utilizarea cuvântului cheie 'lateinit' și delegarea cu 'by lazy {}' în Kotlin?

sobes.tech AI

Răspuns de la AI

lateinit este utilizat pentru inițializarea întârziată a proprietăților modificabile (var) care nu pot fi null și vor fi inițializate mai târziu, de exemplu, în metoda ciclului de viață a unei activități sau fragment. Compilatorul nu garantează inițializarea, iar accesul la o proprietate neinițializată va provoca o excepție UninitializedPropertyAccessException.

by lazy {} este folosit pentru inițializarea întârziată a proprietăților imutabile (val). Inițializarea se face la primul acces la proprietate, iar rezultatul este cache-uit. Acest lucru este sigur pentru fire în mod implicit și garantează că inițializatorul va fi apelat o singură dată.

Caracteristică lateinit by lazy {}
Aplicabil la var val
Nullable Nu nullable Nu nullable
Garanția inițializării Nu (doar de către dezvoltator) Da (la primul acces)
Siguranța firelor Nu garantată implicit Da (implicit)
Tipul proprietății Modificabil Imutabil

Exemplu cu lateinit:

class MyActivity : AppCompatActivity() {

    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView = findViewById(R.id.my_text_view)
        textView.text = "Salut, lateinit!"
    }
}

Exemplu cu by lazy {}:

class MyViewModel : ViewModel() {

    private val apiService: ApiService by lazy { provideApiService() } // Inițializare la primul utilizator

    private fun provideApiService(): ApiService {
        // Logica de creare a ApiService
        return ApiService()
    }

    fun fetchData() {
        // apiService este inițializat aici la primul apel fetchData()
        apiService.getData()
    }
}