Σε αυτό το άρθρο, θα μάθετε για το Sealed class, πώς δημιουργούνται και πότε να τα χρησιμοποιήσετε με τη βοήθεια παραδειγμάτων.
Οι κλειστές τάξεις χρησιμοποιούνται όταν μια τιμή μπορεί να έχει μόνο έναν από τους τύπους από ένα περιορισμένο σύνολο (περιορισμένες ιεραρχίες).
Πριν αναφερθούμε σε λεπτομέρειες σχετικά με τις σφραγισμένες τάξεις, ας διερευνήσουμε ποιο πρόβλημα επιλύουν. Ας πάρουμε ένα παράδειγμα (λαμβάνονται από τον επίσημο ιστότοπο του Kotlin - άρθρο σφραγισμένων τάξεων):
class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )
Στο παραπάνω πρόγραμμα, η βασική κλάση Expr έχει δύο παράγωγες κλάσεις Const (αντιπροσωπεύει έναν αριθμό) και Sum (αντιπροσωπεύει άθροισμα δύο εκφράσεων). Εδώ, είναι υποχρεωτικό να χρησιμοποιείτε else
κλάδο για προεπιλεγμένη κατάσταση κατά την έκφραση
Τώρα, εάν αντλήσετε μια νέα υποκατηγορία από την Expr
τάξη, ο μεταγλωττιστής δεν θα εντοπίσει τίποτα καθώς ο else
κλάδος το χειρίζεται που μπορεί να οδηγήσει σε σφάλματα. Θα ήταν καλύτερα εάν ο μεταγλωττιστής εξέδωσε ένα σφάλμα όταν προσθέσαμε μια νέα υποκατηγορία.
Για να λύσετε αυτό το πρόβλημα, μπορείτε να χρησιμοποιήσετε σφραγισμένη τάξη. Όπως αναφέρθηκε, η σφραγισμένη τάξη περιορίζει τη δυνατότητα δημιουργίας υποκατηγοριών. Και, όταν χειρίζεστε όλες τις υποκατηγορίες μιας σφραγισμένης κλάσης σε μια when
έκφραση, δεν είναι απαραίτητο να χρησιμοποιήσετε else
κλάδο.
Για να δημιουργήσετε μια σφραγισμένη τάξη, χρησιμοποιείται σφραγισμένος τροποποιητής. Για παράδειγμα,
σφραγισμένη κλάση
Παράδειγμα: Σφραγισμένη τάξη
Δείτε πώς μπορείτε να λύσετε το παραπάνω πρόβλημα χρησιμοποιώντας σφραγισμένη τάξη:
sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN )
Όπως μπορείτε να δείτε, δεν υπάρχει else
κλάδος. Εάν αντλήσετε μια νέα υποκατηγορία από την Expr
τάξη, ο μεταγλωττιστής θα παραπονεθεί εκτός εάν η υποκατηγορία αντιμετωπίζεται στην when
έκφραση.
Λίγες σημαντικές σημειώσεις
- Όλες οι υποκατηγορίες μιας σφραγισμένης κλάσης πρέπει να δηλώνονται στο ίδιο αρχείο όπου δηλώνεται η σφραγισμένη κλάση.
- Μια σφραγισμένη τάξη είναι αφηρημένη από μόνη της και δεν μπορείτε να δημιουργήσετε αντικείμενα από αυτήν.
- Δεν μπορείτε να δημιουργήσετε μη ιδιωτικούς κατασκευαστές σφραγισμένης κλάσης. οι κατασκευαστές τους είναι
private
από προεπιλογή.
Διαφορά μεταξύ κατηγορίας Enum και Sealed
Η κατηγορία Enum και η σφραγισμένη τάξη είναι αρκετά παρόμοια. Το σύνολο τιμών για έναν τύπο enum περιορίζεται επίσης όπως μια σφραγισμένη κατηγορία.
Η μόνη διαφορά είναι ότι, το enum μπορεί να έχει μόνο μία παρουσία, ενώ μια υποκατηγορία μιας σφραγισμένης κλάσης μπορεί να έχει πολλές παρουσίες.