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 |
|---|---|---|
| Παραδείγματα | Περιορισμένο σύνολο ονοματοδοτημένων σταθερών | Περιορισμένο σύνολο τύπων |
| Δεδομένα σε παραλλαγές | Όχι (μόνο ιδιότητες) | Ναι (μέσω υποκλάσεων) |
| Αφηρημένα μέλη | Όχι | Ναι |
| Κληρονομικότητα | Όχι | Ναι, αλλά περιορισμένο στο ίδιο αρχείο/μονάδα |