Sobes.tech
Middle

Πώς να χρησιμοποιήσετε κλειστές κλάσεις για την μοντελοποίηση ιεραρχιών σε Kotlin;

sobes.tech AI

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

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

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

  • Όλοι οι άμεσοι υποτύποι πρέπει να βρίσκονται στο ίδιο αρχείο με την κλειστή κλάση (πριν από το Kotlin 1.5). Από το Kotlin 1.5 και μετά, μπορούν να βρίσκονται σε οποιοδήποτε αρχείο της ίδιας μεταγλώττισης.
  • Οι υποτύποι μιας κλειστής κλάσης μπορούν να είναι κανονικές κλάσεις, data classes, δηλώσεις object ή άλλες κλειστές κλάσεις.
  • Ο κατασκευαστής της κλειστής κλάσης είναι προεπιλεγμένα ιδιωτικός; άλλοι τροποποιητές (public, protected, internal) δεν επιτρέπονται.
  • Επιτρέπουν τη χρήση πλήρους (exhaustive) ανάλυσης σε εκφράσεις when, διασφαλίζοντας ότι όλες οι πιθανές επιλογές καλύπτονται και εξαλείφοντας την ανάγκη για μια else-αποκάλυψη.

Παράδειγμα χρήσης για μοντελοποίηση της κατάστασης ενός περιβάλλοντος χρήστη:

sealed class UiState {
    object Loading : UiState() // Κατάσταση φόρτωσης
    data class Success(val data: String) : UiState() // Επιτυχής λήψη δεδομένων
    data class Error(val message: String) : UiState() // Σφάλμα
}

Χρήση σε μια έκφραση when:

fun handleUiState(state: UiState): String {
    return when (state) {
        UiState.Loading -> "Φόρτωση δεδομένων..."
        is UiState.Success -> "Τα δεδομένα φορτώθηκαν με επιτυχία: ${state.data}"
        is UiState.Error -> "Σφάλμα: ${state.message}"
    }
}

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

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