Sobes.tech
Middle

Quelle est la différence entre l'utilisation du mot-clé 'lateinit' et la délégation avec 'by lazy {}' en Kotlin?

sobes.tech IA

Réponse de l'IA

lateinit est utilisé pour l'initialisation différée des propriétés modifiables (var) qui ne peuvent pas être nulles et seront initialisées plus tard, par exemple dans la méthode du cycle de vie d'une activité ou d'un fragment. Le compilateur ne garantit pas l'initialisation, et accéder à une propriété non initialisée provoquera une exception UninitializedPropertyAccessException.

by lazy {} est utilisé pour l'initialisation différée des propriétés immuables (val). L'initialisation se fait lors du premier accès à la propriété, et le résultat est mis en cache. C'est thread-safe par défaut et garantit que l'initialisateur sera appelé une seule fois.

Caractéristique lateinit by lazy {}
Applicable à var val
Nullabilité Non nullable Non nullable
Garantie d'initialisation Non (seulement par le développeur) Oui (au premier accès)
Sécurité thread Non garanti par défaut Oui (par défaut)
Type de propriété Modifiable Immodifiable

Exemple avec 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 = "Bonjour, lateinit!"
    }
}

Exemple avec by lazy {}:

class MyViewModel : ViewModel() {

    private val apiService: ApiService by lazy { provideApiService() } // Initialisation à la première utilisation

    private fun provideApiService(): ApiService {
        // Logique de création d'ApiService
        return ApiService()
    }

    fun fetchData() {
        // apiService est initialisé ici lors du premier appel à fetchData()
        apiService.getData()
    }
}