Sobes.tech
Middle

Wann sollte man 'lateinit' und 'by lazy' in Kotlin verwenden?

sobes.tech KI

Antwort von AI

lateinit wird für nicht-nullbare Eigenschaften verwendet, die später initialisiert werden, vor dem ersten Zugriff auf sie. Es wird mit var angewendet.

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Wird in onCreate initialisiert

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Jetzt kann binding verwendet werden
    }
}

by lazy wird für nicht-nullbare oder nullable Eigenschaften verwendet, die bei erstem Zugriff initialisiert werden. Es wird mit val angewendet.

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

Vergleich:

Merkmal lateinit by lazy
Anwendung var val
Eigenschaftstyp Nicht-nullbar Nicht-nullbar oder nullable
Initialisierung Spät, manuell Beim ersten Zugriff, automatisch
Thread-Sicherheit Nicht standardmäßig garantiert (wenn nicht manuell synchronisiert) Standardmäßig garantiert (synchronisiert)
Nullwert Vor der Initialisierung nicht erlaubt (wirft Ausnahme) Nein (Typ wird durch Initialisierer bestimmt)

Verwenden Sie lateinit, wenn der Wert der Eigenschaft vom Kontext oder anderen Faktoren abhängt und nach der Objekterstellung, aber vor der Verwendung festgelegt werden muss (z.B. beim Binden von Views in einer Android-Activity).

Verwenden Sie by lazy für Eigenschaften, die teuer in der Erstellung sind oder die während der gesamten Lebensdauer des Objekts möglicherweise nicht benötigt werden, oder wenn die Initialisierung bis zum ersten tatsächlichen Gebrauch verzögert werden soll.