sealed class και interface στην Kotlin — τι είναι, σύνταξη και εφαρμογή

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-06-20 Χρόνος ανάγνωσης: 11 λεπ

sealed class και sealed interface στην Kotlin είναι μηχανισμοί περιορισμένης ιεραρχίας τύπων, όπου όλες οι πιθανές υποκλάσεις είναι γνωστές στο στάδιο μεταγλώττισης. Σε αντίθεση με τις συνηθισμένες αφηρημένες κλάσεις, το sealed class εγγυάται εξαντλητική επεξεργασία όλων των παραλλαγών στην έκφραση when. Σύμφωνα με την τεκμηρίωση JetBrains Kotlin Language Guide (2026), οι sealed τύποι αποτελούν τη βάση για τη μοντελοποίηση καταστάσεων, οθονών UI και τύπων αποτελέσματος σε έργα Kotlin.

Κύρια σημεία

  • sealed — περιορισμένη ιεραρχία, όπου όλες οι υποκλάσεις είναι γνωστές κατά τη μεταγλώττιση
  • when — εξαντλητική επεξεργασία όλων των υποκλάσεων χωρίς υποχρεωτικό else μπλοκ
  • sealed interface — προστέθηκε στην Kotlin 1.5 για ευέλικτες ιεραρχίες χωρίς περιορισμούς κληρονομικότητας
  • Μεταγλώττιση — σφάλμα μεταγλώττισης σε μη πλήρες when για sealed τύπους
  • Ιεραρχία — όλες οι υποκλάσεις πρέπει να είναι στο ίδιο αρχείο ή μέσα στην sealed κλάση

Τι είναι το sealed class και το sealed interface;

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. Οι υποκλάσεις δηλώνονται στο ίδιο αρχείο.

kotlin
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 class

Οι sealed κλάσεις μπορούν να είναι ένθετες, δημιουργώντας ιεραρχίες πολλαπλών επιπέδων για σύνθετα μοντέλα δεδομένων χωρίς απώλεια ασφάλειας τύπων.

kotlin
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 (Kotlin 1.5+)

Το sealed interface δηλώνεται παρόμοια με το sealed class, αλλά επιτρέπει την υλοποίηση πολλαπλών sealed interfaces σε μία κλάση.

kotlin
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 αντί για sealed class

Το sealed interface είναι προτιμότερο όταν η ιεραρχία δεν απαιτεί κοινή κατάσταση ή κατασκευαστή. Σύμφωνα με το JetBrains Kotlin Guidelines (2026), το sealed interface θα πρέπει να χρησιμοποιείται από προεπιλογή για όλες τις νέες ιεραρχίες όπου δεν απαιτείται κοινός κατασκευαστής, καθιστώντας τον κώδικα πιο ευέλικτο για μελλοντικές επεκτάσεις.

Εξαντλητική επεξεργασία στο when

Το κύριο πλεονέκτημα των sealed τύπων είναι η εξαντλητική (exhaustive) επεξεργασία στην έκφραση when. Ο μεταγλωττιστής ελέγχει ότι όλες οι πιθανές υποκλάσεις έχουν ληφθεί υπόψη.

kotlin
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 αποτρέπει καταστάσεις όπου ο προγραμματιστής δεν έχει επεξεργαστεί όλες τις πιθανές παραλλαγές εμφάνισης οθόνης.

Σύγκριση sealed class με enum class

enum class και sealed class συχνά συγχέονται, αλλά έχουν διαφορετικούς σκοπούς και δυνατότητες.

Χαρακτηριστικόsealed classenum class
ΣτιγμιότυπαΠολλαπλά (data class), ένα (object)Ακριβώς ένα ανά σταθερά
ΙδιότητεςΔιαφορετικές για κάθε υποκλάσηΊδιες για όλες τις σταθερές
ΚληρονομικότηταΝαι (από sealed class)Όχι (implicit final)
ΚατασκευαστήςΜπορεί να έχει παραμέτρουςΜόνο κοινός για όλες τις σταθερές
ΙεραρχίαΠεριορισμένη, sealedΣταθερό σύνολο σταθερών

Η επιλογή μεταξύ sealed class και enum class εξαρτάται από την εργασία. Εάν οι παραλλαγές δεν φέρουν πρόσθετα δεδομένα — χρησιμοποιήστε enum. Εάν κάθε παραλλαγή περιέχει μοναδικά πεδία — χρησιμοποιήστε sealed class ή sealed interface.

Πρακτικά σενάρια εφαρμογής

Οι sealed τύποι χρησιμοποιούνται σε έργα Kotlin για μια σειρά τυπικών σεναρίων που απαιτούν μοντελοποίηση με ασφάλεια τύπων.

Κατάσταση UI στο Jetpack Compose

Κάθε οθόνη Compose μπορεί να έχει μια sealed class UiState που περιγράφει όλες τις πιθανές καταστάσεις: Idle, Loading, Content(data), Error(exception). Η έκφραση when εγγυάται ότι όλες οι καταστάσεις έχουν υποστεί επεξεργασία.

Αποτέλεσμα δικτυακών αιτημάτων

NetworkResult με παραλλαγές Success, Error, Loading — πρότυπο μοτίβο σε έργα Kotlin με Retrofit και Ktor. Το sealed class εξασφαλίζει ασφαλή επεξεργασία κάθε αποτελέσματος αιτήματος.

Πλοήγηση σε έργα multi-module

sealed interface για διαδρομές πλοήγησης επιτρέπει στα modules να δηλώνουν τις δικές τους διαδρομές, παραμένοντας στο πλαίσιο μιας ενιαίας ιεραρχίας. Αυτό εξαλείφει σφάλματα με άγνωστες διαδρομές στο στάδιο μεταγλώττισης.

Σύμφωνα με το KotlinConf (2025), τα sealed class και sealed interface αποτελούν τη βάση του type-safe σχεδιασμού σε σύγχρονες εφαρμογές Kotlin. Συνδυάζονται με data class για τη μοντελοποίηση σύνθετων δομών τομέα χωρίς απώλεια ασφάλειας στο στάδιο μεταγλώττισης.

Συχνές Ερωτήσεις

Πού πρέπει να δηλώνονται οι υποκλάσεις του sealed class;

Όλες οι άμεσες υποκλάσεις του sealed class πρέπει να δηλώνονται στο ίδιο αρχείο. Για sealed interface ισχύει ο ίδιος κανόνας — οι υλοποιήσεις σε ένα αρχείο.

Μπορεί το sealed interface να έχει υλοποιήσεις σε άλλο αρχείο;

Όχι, ο κανόνας ενός αρχείου ισχύει και για το sealed interface. Όλες οι υλοποιήσεις πρέπει να βρίσκονται στο αρχείο όπου δηλώνεται το sealed interface.

Ποια είναι η διαφορά μεταξύ sealed class και sealed interface;

Το sealed interface δεν έχει κατάσταση και κατασκευαστή, επιτρέπει πολλαπλή υλοποίηση. Το sealed class μπορεί να έχει κατασκευαστή και κοινή κατάσταση, αλλά μια κλάση μπορεί να κληρονομήσει μόνο ένα sealed class.

Πώς βοηθούν οι sealed κλάσεις στις εκφράσεις when;

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

Μπορεί να δημιουργηθεί sealed class με κατασκευαστή;

Ναι, το sealed class μπορεί να έχει κατασκευαστή (από προεπιλογή private). Όλες οι υποκλάσεις μπορούν να μεταβιβάζουν παραμέτρους σε αυτόν τον κατασκευαστή μέσω super().

Σύνοψη

  • sealed class — περιορισμένη ιεραρχία με υποκλάσεις γνωστές κατά τη μεταγλώττιση
  • sealed interface — ευέλικτη εναλλακτική (Kotlin 1.5+) με υποστήριξη πολλαπλής υλοποίησης
  • when — εξαντλητική επεξεργασία με έλεγχο μεταγλωττιστή, else δεν απαιτείται
  • Ένα αρχείο — όλες οι υποκλάσεις και υλοποιήσεις πρέπει να είναι στο ίδιο αρχείο με τον sealed τύπο
  • Μοντελοποίηση — καταστάσεις UI, αποτελέσματα δικτύου, πλοήγηση, συστήματα γεγονότων
  • Ασφάλεια — προσθήκη νέας υποκλάσης χωρίς επεξεργασία στο when προκαλεί σφάλμα μεταγλώττισης
  • Επιλογή — sealed interface προτιμότερο από προεπιλογή, sealed class όταν απαιτείται κοινή κατάσταση

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης