sealed class και sealed interface στην Kotlin είναι μηχανισμοί περιορισμένης ιεραρχίας τύπων, όπου όλες οι πιθανές υποκλάσεις είναι γνωστές στο στάδιο μεταγλώττισης. Σε αντίθεση με τις συνηθισμένες αφηρημένες κλάσεις, το sealed class εγγυάται εξαντλητική επεξεργασία όλων των παραλλαγών στην έκφραση when. Σύμφωνα με την τεκμηρίωση JetBrains Kotlin Language Guide (2026), οι sealed τύποι αποτελούν τη βάση για τη μοντελοποίηση καταστάσεων, οθονών UI και τύπων αποτελέσματος σε έργα Kotlin.
Κύρια σημεία
sealed class είναι μια αφηρημένη κλάση με περιορισμό: όλες οι άμεσες υποκλάσεις της πρέπει να δηλώνονται στο ίδιο αρχείο με την sealed class. Αυτός ο περιορισμός καθιστά την ιεραρχία κλειστή (sealed) — κανένας κώδικας εκτός του αρχείου δεν μπορεί να προσθέσει νέα υποκλάση.
sealed interface, που προστέθηκε στην Kotlin 1.5, παρέχει την ίδια εγγύηση με την ευελιξία μιας διεπαφής: το sealed interface μπορεί να υλοποιηθεί από πολλές κλάσεις, αντικείμενα ή άλλες διεπαφές σε ένα αρχείο. Σε αντίθεση με το sealed class, το sealed interface δεν έχει περιορισμό απλής κληρονομικότητας — μια κλάση μπορεί να υλοποιεί πολλαπλά sealed interfaces ταυτόχρονα.
Σύμφωνα με το Kotlin Evolution and Roadmap (2026), το sealed interface προστέθηκε κατόπιν αιτήματος της κοινότητας για πιο ευέλικτη μοντελοποίηση. Το κύριο κίνητρο ήταν η δυνατότητα συνδυασμού ανεξάρτητων ιεραρχιών τύπων χωρίς πολλαπλή κληρονομικότητα κλάσεων.
Η δήλωση sealed class ξεκινά με τον τροποποιητή sealed πριν από το class. Οι υποκλάσεις δηλώνονται στο ίδιο αρχείο.
sealed class NetworkResult {
data class Success(val data: String) : NetworkResult()
data class Error(val message: String) : NetworkResult()
object Loading : NetworkResult()
}
Κάθε υποκλάση sealed class μπορεί να έχει τις δικές της ιδιότητες και μεθόδους. Το Loading είναι singleton (object), τα Success και Error είναι data class με παραμέτρους. Ο μεταγλωττιστής γνωρίζει και τις τρεις παραλλαγές και ελέγχει την πληρότητά τους κατά τη χρήση σε when.
Οι sealed κλάσεις μπορούν να είναι ένθετες, δημιουργώντας ιεραρχίες πολλαπλών επιπέδων για σύνθετα μοντέλα δεδομένων χωρίς απώλεια ασφάλειας τύπων.
sealed class UiState {
object Idle : UiState()
object Loading : UiState()
data class Content(val items: List<Item>) : UiState()
data class Error(val exception: Throwable) : UiState()
}
Το sealed interface δηλώνεται παρόμοια με το sealed class, αλλά επιτρέπει την υλοποίηση πολλαπλών sealed interfaces σε μία κλάση.
sealed interface Action
sealed interface Loggable
data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable
Η κλάση Navigate υλοποιεί ταυτόχρονα δύο sealed interfaces — Action και Loggable. Για sealed class αυτό είναι αδύνατο λόγω του περιορισμού απλής κληρονομικότητας. Το sealed interface παρέχει ευελιξία συνδυασμού ανεξάρτητων ιεραρχιών.
Το sealed interface είναι προτιμότερο όταν η ιεραρχία δεν απαιτεί κοινή κατάσταση ή κατασκευαστή. Σύμφωνα με το JetBrains Kotlin Guidelines (2026), το sealed interface θα πρέπει να χρησιμοποιείται από προεπιλογή για όλες τις νέες ιεραρχίες όπου δεν απαιτείται κοινός κατασκευαστής, καθιστώντας τον κώδικα πιο ευέλικτο για μελλοντικές επεκτάσεις.
Το κύριο πλεονέκτημα των sealed τύπων είναι η εξαντλητική (exhaustive) επεξεργασία στην έκφραση when. Ο μεταγλωττιστής ελέγχει ότι όλες οι πιθανές υποκλάσεις έχουν ληφθεί υπόψη.
fun handleResult(result: NetworkResult): String = when (result) {
is NetworkResult.Success -> "Data: ${result.data}"
is NetworkResult.Error -> "Error: ${result.message}"
is NetworkResult.Loading -> "Loading..."
// else δεν απαιτείται — ο μεταγλωττιστής γνωρίζει ότι όλες οι παραλλαγές καλύπτονται
}
Εάν ο προγραμματιστής προσθέσει μια νέα υποκλάση στην sealed ιεραρχία αλλά ξεχάσει να την επεξεργαστεί στο when — ο μεταγλωττιστής θα δώσει σφάλμα. Αυτή είναι ασφάλεια σε επίπεδο τύπων, μη διαθέσιμη όταν χρησιμοποιούνται ανοιχτές ιεραρχίες με else κλάδο.
Σύμφωνα με το Google Android Developers (2026), οι sealed κλάσεις είναι ο προτεινόμενος τρόπος μοντελοποίησης κατάστασης UI στο Jetpack Compose. Ο εξαντλητικός έλεγχος when αποτρέπει καταστάσεις όπου ο προγραμματιστής δεν έχει επεξεργαστεί όλες τις πιθανές παραλλαγές εμφάνισης οθόνης.
enum class και sealed class συχνά συγχέονται, αλλά έχουν διαφορετικούς σκοπούς και δυνατότητες.
| Χαρακτηριστικό | sealed class | enum class |
|---|---|---|
| Στιγμιότυπα | Πολλαπλά (data class), ένα (object) | Ακριβώς ένα ανά σταθερά |
| Ιδιότητες | Διαφορετικές για κάθε υποκλάση | Ίδιες για όλες τις σταθερές |
| Κληρονομικότητα | Ναι (από sealed class) | Όχι (implicit final) |
| Κατασκευαστής | Μπορεί να έχει παραμέτρους | Μόνο κοινός για όλες τις σταθερές |
| Ιεραρχία | Περιορισμένη, sealed | Σταθερό σύνολο σταθερών |
Η επιλογή μεταξύ sealed class και enum class εξαρτάται από την εργασία. Εάν οι παραλλαγές δεν φέρουν πρόσθετα δεδομένα — χρησιμοποιήστε enum. Εάν κάθε παραλλαγή περιέχει μοναδικά πεδία — χρησιμοποιήστε sealed class ή sealed interface.
Οι sealed τύποι χρησιμοποιούνται σε έργα Kotlin για μια σειρά τυπικών σεναρίων που απαιτούν μοντελοποίηση με ασφάλεια τύπων.
Κάθε οθόνη Compose μπορεί να έχει μια sealed class UiState που περιγράφει όλες τις πιθανές καταστάσεις: Idle, Loading, Content(data), Error(exception). Η έκφραση when εγγυάται ότι όλες οι καταστάσεις έχουν υποστεί επεξεργασία.
NetworkResult με παραλλαγές Success, Error, Loading — πρότυπο μοτίβο σε έργα Kotlin με Retrofit και Ktor. Το sealed class εξασφαλίζει ασφαλή επεξεργασία κάθε αποτελέσματος αιτήματος.
sealed interface για διαδρομές πλοήγησης επιτρέπει στα modules να δηλώνουν τις δικές τους διαδρομές, παραμένοντας στο πλαίσιο μιας ενιαίας ιεραρχίας. Αυτό εξαλείφει σφάλματα με άγνωστες διαδρομές στο στάδιο μεταγλώττισης.
Σύμφωνα με το KotlinConf (2025), τα sealed class και sealed interface αποτελούν τη βάση του type-safe σχεδιασμού σε σύγχρονες εφαρμογές Kotlin. Συνδυάζονται με data class για τη μοντελοποίηση σύνθετων δομών τομέα χωρίς απώλεια ασφάλειας στο στάδιο μεταγλώττισης.
Συχνές Ερωτήσεις
Όλες οι άμεσες υποκλάσεις του sealed class πρέπει να δηλώνονται στο ίδιο αρχείο. Για sealed interface ισχύει ο ίδιος κανόνας — οι υλοποιήσεις σε ένα αρχείο.
Όχι, ο κανόνας ενός αρχείου ισχύει και για το sealed interface. Όλες οι υλοποιήσεις πρέπει να βρίσκονται στο αρχείο όπου δηλώνεται το sealed interface.
Το sealed interface δεν έχει κατάσταση και κατασκευαστή, επιτρέπει πολλαπλή υλοποίηση. Το sealed class μπορεί να έχει κατασκευαστή και κοινή κατάσταση, αλλά μια κλάση μπορεί να κληρονομήσει μόνο ένα sealed class.
Ο μεταγλωττιστής ελέγχει την πληρότητα του when: αν δεν έχουν υποστεί επεξεργασία όλες οι υποκλάσεις, ο κώδικας δεν μεταγλωττίζεται. Αυτό εξαλείφει σφάλματα χρόνου εκτέλεσης και καθιστά τον κώδικα ασφαλέστερο.
Ναι, το sealed class μπορεί να έχει κατασκευαστή (από προεπιλογή private). Όλες οι υποκλάσεις μπορούν να μεταβιβάζουν παραμέτρους σε αυτόν τον κατασκευαστή μέσω super().
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης