Sobes.tech
Middle

Πότε πρέπει να χρησιμοποιείτε 'lateinit' και 'by lazy' σε Kotlin;

sobes.tech AI

Απάντηση από AI

Το lateinit χρησιμοποιείται για μη-nullable ιδιότητες που θα αρχικοποιηθούν αργότερα, πριν από την πρώτη πρόσβαση σε αυτές. Εφαρμόζεται με var.

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Θα αρχικοποιηθεί στο onCreate

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Τώρα μπορεί να χρησιμοποιηθεί το binding
    }
}

Το by lazy χρησιμοποιείται για μη-nullable ή nullable ιδιότητες, που αρχικοποιούνται κατά την πρώτη πρόσβαση. Εφαρμόζεται με val.

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

Σύγκριση:

Χαρακτηριστικό lateinit by lazy
Εφαρμογή var val
Τύπος ιδιότητας Μη-nullable Μη-nullable ή nullable
Αρχικοποίηση Αργά, χειροκίνητα Κατά την πρώτη πρόσβαση, αυτόματα
Ασφάλεια νημάτων Δεν εγγυάται προεπιλεγμένα (αν δεν συγχρονιστεί χειροκίνητα) Εγγυάται προεπιλεγμένα (συγχρονισμένο)
Μηδενική τιμή Δεν επιτρέπεται πριν την αρχικοποίηση (θα ρίξει εξαίρεση) Όχι (ο τύπος καθορίζεται από τον αρχικοποιητή)

Χρησιμοποιήστε το lateinit όταν η τιμή της ιδιότητας εξαρτάται από το πλαίσιο ή άλλους παράγοντες και πρέπει να οριστεί μετά τη δημιουργία του αντικειμένου, αλλά πριν από τη χρήση του (π.χ., κατά τη σύνδεση View σε Android Activity).

Χρησιμοποιήστε το by lazy για ιδιότητες που είναι δαπανηρές στην κατασκευή ή μπορεί να μην χρειαστούν καθ' όλη τη διάρκεια ζωής του αντικειμένου, ή όταν θέλετε να καθυστερήσετε την αρχικοποίηση μέχρι την πρώτη πραγματική χρήση.