Middle
Τι είναι το 'lazy' και το 'lateinit' στο Kotlin;
sobes.tech AI
Απάντηση από AI
lazy - ιδιότητα-αντιπρόσωπος για την καθυστερημένη και αμετάβλητη (val) αρχικοποίηση ιδιοτήτων. Η τιμή υπολογίζεται κατά την πρώτη πρόσβαση στην ιδιότητα και στη συνέχεια αποθηκεύεται στην cache.
// Παράδειγμα χρήσης του lazy
val lazyValue: String by lazy {
println("Αρχικοποίηση") // θα εμφανιστεί μόνο μία φορά κατά την πρώτη πρόσβαση
"Γειά σου, lazy!"
}
lateinit - τροποποιητής για μεταβλητές (var) ιδιότητες, που επιτρέπει την αναβολή της αρχικοποίησης μέχρι την πρώτη πρόσβαση. Η ιδιότητα πρέπει να είναι μη-null. Η χρήση της ιδιότητας πριν την αρχικοποίηση οδηγεί σε UninitializedPropertyAccessException.
// Παράδειγμα χρήσης του lateinit
lateinit var lateinitVariable: String
fun initializeVariable() {
lateinitVariable = "Γειά σου, lateinit!"
}
fun useVariable() {
// Έλεγχος αν έχει αρχικοποιηθεί πριν τη χρήση (προαιρετικό, αλλά συνιστάται)
if (::lateinitVariable.isInitialized) {
println(lateinitVariable)
} else {
println("Η μεταβλητή δεν έχει ακόμα αρχικοποιηθεί")
}
}
Βασικές διαφορές:
| Χαρακτηριστικό | lazy |
lateinit |
|---|---|---|
| Τύπος ιδιότητας | val (μόνο ανάγνωση) |
var (μεταβλητή) |
| Nullability | Μπορεί να είναι nullable ή non-nullable | Πρέπει να είναι non-nullable |
| Αρχικοποίηση | Αυτόματη, κατά την πρώτη πρόσβαση | Χειροκίνητη |
| Αναβολή στην αρχικοποίηση | Ναι, κατά την πρώτη πρόσβαση | Ναι, δήλωση χωρίς αρχικοποίηση |
| Ασφάλεια νημάτων | Προεπιλεγμένα ασφαλής (συγχρονισμός), υπάρχουν επιλογές | Δεν εγγυάται, εξαρτάται από το πλαίσιο |
| Εξαίρεση πριν την πρόσβαση | Όχι, αυτόματα αρχικοποιείται | UninitializedPropertyAccessException |