Sobes.tech
Middle

Τι είναι οι κλάσεις 'sealed' στο Kotlin και σε ποιες περιπτώσεις πρέπει να χρησιμοποιούνται;

sobes.tech AI

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

Η κλάση sealed χρησιμοποιείται για την αναπαράσταση μιας περιορισμένης ιεραρχίας κλάσεων. Όλοι οι άμεσοι υποτύποι μιας κλάσης sealed πρέπει να ορίζονται στο ίδιο αρχείο με την κλάση sealed ή στα ίδια modules (για Kotlin 1.5+). Αυτό επιτρέπει στον μεταγλωττιστή να ελέγξει ότι όλοι οι πιθανοί υποτύποι έχουν αντιμετωπιστεί σε μια έκφραση when, καθιστώντας την πλήρη χωρίς την ανάγκη για μια διακλάδωση else.

Βασικά χαρακτηριστικά:

  • Όλοι οι άμεσοι υποκλάσεις πρέπει να είναι τοπικές.
  • Ο κατασκευαστής της κλάσης sealed είναι private από προεπιλογή.
  • Η κλάση sealed δεν μπορεί να είναι αφηρημένη.
  • Δεν επιτρέπει τη δημιουργία στιγμιοτύπων.

Περιπτώσεις χρήσης:

  • Αναπαράσταση ενός περιορισμένου συνόλου καταστάσεων ή αποτελεσμάτων. Για παράδειγμα, Loading, Success(data), Error(message).
    sealed class Result<out T> {
       data class Success<T>(val data: T) : Result<T>()
       data class Error(val message: String) : Result<Nothing>()
       object Loading : Result<Nothing>()
    }
    
  • Διαχείριση των παραλλαγών σε μια έκφραση when με εγγύηση ολοκληρωτικότητας.
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Ληφθέντα δεδομένα: ${result.data}")
          is Result.Error -> println("Σφάλμα: ${result.message}")
          Result.Loading -> println("Φόρτωση...")
       }
       // Δεν απαιτείται μια διακλάδωση `else`, καθώς ο μεταγλωττιστής γνωρίζει όλους τους υποτύπους.
    }
    
  • Χρήση ως ισοδύναμο των enum με δυνατότητα ενσωμάτωσης δεδομένων σε κάθε παραλλαγή.

Σύγκριση με τις κλάσεις enum:

Χαρακτηριστικό enum class sealed class
Παραδείγματα Περιορισμένο σύνολο ονοματοδοτημένων σταθερών Περιορισμένο σύνολο τύπων
Δεδομένα σε παραλλαγές Όχι (μόνο ιδιότητες) Ναι (μέσω υποκλάσεων)
Αφηρημένα μέλη Όχι Ναι
Κληρονομικότητα Όχι Ναι, αλλά περιορισμένο στο ίδιο αρχείο/μονάδα