Sobes.tech
Middle

Είσαι εξοικειωμένος με τις κλειστές κλάσεις και ποια είναι η ιδιαιτερότητά τους;

sobes.tech AI

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

Ναι, το γνωρίζω.

Το χαρακτηριστικό των sealed κλάσεων είναι ότι επιτρέπουν τον περιορισμό της ιεραρχίας κληρονόμησης. Όλοι οι άμεσοι υποτύποι μιας sealed κλάσης πρέπει να δηλώνονται στο ίδιο αρχείο. Αυτό διασφαλίζει ότι ο μεταγλωττιστής γνωρίζει όλους τους πιθανούς υποτύπους, κάτι που είναι χρήσιμο για τον έλεγχο πληρότητας στις εκφράσεις when.

Παράδειγμα:

sealed class Result {
    data class Success(val message: String) : Result()
    data class Error(val code: Int, val description: String) : Result()
    object Loading : Result() // Singleton για την κατάσταση φόρτωσης
}

fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Επιτυχία: ${result.message}")
        is Result.Error -> println("Σφάλμα ${result.code}: ${result.description}")
        Result.Loading -> println("Φόρτωση...")
        // Δεν χρειάζεται else, καθώς ο μεταγλωττιστής γνωρίζει όλες τις επιλογές
    }
}

Πλεονεκτήματα:

  • Ασφάλεια: Διασφαλίζει την πληρότητα των εκφράσεων when χωρίς ανάγκη για else.
  • Αναγνωσιμότητα: Δείχνει σαφώς ένα περιορισμένο σύνολο πιθανών καταστάσεων ή υποτύπων.
  • Έλεγχος: Προλαμβάνει την ανεξέλεγκτη κληρονόμηση από έξω.

Διαφορά με το enum class: Οι sealed κλάσεις μπορούν να έχουν διαφορετικούς τύπους δεδομένων για κάθε υποτύπο (όπως το Success και το Error στο παράδειγμα), ενώ τα στοιχεία του enum class είναι στατικά και μπορούν να έχουν μόνο ορισμένες ιδιότητες, κοινές σε όλα. Οι sealed κλάσεις μπορούν επίσης να έχουν αντικείμενα-παραδείγματα (Loading).