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()
}
}