Sobes.tech
Junior

Εξηγήστε τι είναι η ασφάλεια null στη γλώσσα Kotlin.

sobes.tech AI

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

Η ασφάλεια null — είναι μια λειτουργία της γλώσσας Kotlin που αποτρέπει σφάλματα που σχετίζονται με αναφορές null. Επιτυγχάνεται με τη δημιουργία δύο τύπων αναφορών: nullable (που επιτρέπει null) και non-nullable (που δεν επιτρέπει null).

Οι τύποι non-nullable δηλώνονται όπως συνήθως:

var nonNullableString: String = "Hello" // Δεν μπορεί να είναι null

Οι τύποι nullable δηλώνονται με το σύμβολο ? μετά το όνομα του τύπου:

var nullableString: String? = "Hello" // Μπορεί να είναι null
nullableString = null

Η Kotlin απαιτεί ρητή διαχείριση των nullable τύπων, αποτρέποντας την άμεση πρόσβαση στα μέλη τους χωρίς προηγούμενο έλεγχο για null. Για αυτό, παρέχονται οι ακόλουθοι μηχανισμοί:

  1. Τελεστής ασφαλούς κλήσης (?.): Καλεί μια μέθοδο ή προσπελάζει μια ιδιότητα μόνο αν το αντικείμενο δεν είναι null. Διαφορετικά, επιστρέφει null.

    val length = nullableString?.length // length θα είναι `Int?` ή `null`
    
  2. Τελεστής Elvis (?:): Παρέχει μια προεπιλεγμένη τιμή αν η έκφραση στα αριστερά του τελεστή είναι null.

    val nonNullLength = nullableString?.length ?: 0 // nonNullLength θα είναι `Int`, 0 αν το nullableString είναι null
    
  3. Τελεστής επιβεβαίωσης μη-null (!!): Μετατρέπει έναν nullable τύπο σε non-nullable. Αν η τιμή είναι null, ρίχνει μια εξαίρεση NullPointerException. Χρησιμοποιείται όταν ο προγραμματιστής είναι βέβαιος ότι η τιμή δεν είναι null.

    val sureLength = nullableString!!.length // Θα ρίξει NullPointerException αν το nullableString είναι null
    
  4. Έλεγχοι με if: Παραδοσιακός έλεγχος για null με if. Ο μεταγλωττιστής πραγματοποιεί ένα έξυπνο cast (smart cast) του nullable τύπου σε non-nullable μέσα στο μπλοκ if, αν ο έλεγχος περάσει.

    if (nullableString != null) {
        val length = nullableString.length // Εδώ το nullableString αντιμετωπίζεται ως String
    }
    

Αυτοί οι μηχανισμοί επιτρέπουν τον ρητό χειρισμό των καταστάσεων όπου μια μεταβλητή μπορεί να είναι null, μειώνοντας σημαντικά την πιθανότητα εμφάνισης NullPointerException κατά την εκτέλεση του προγράμματος.