Το typealias είναι ένας μηχανισμός της Kotlin για τη δημιουργία ενός εναλλακτικού ονόματος ενός υπάρχοντος τύπου. Η λέξη-κλειδί typealias επιτρέπει την αντικατάσταση μιας σύνθετης δήλωσης τύπου με ένα σύντομο και κατανοητό ψευδώνυμο, χωρίς τη δημιουργία νέου τύπου. Σύμφωνα με την τεκμηρίωση της Kotlin (2026), το typealias βελτιώνει την αναγνωσιμότητα του κώδικα, ειδικά σε υπογραφές συναρτήσεων με συναρτησιακούς τύπους. Το typealias καθιστά τον κώδικα αυτο-τεκμηριωμένο, αντικαθιστώντας τις πολυλογικές δηλώσεις με κατανοητούς ονομασμένους τύπους.
Κύρια σημεία
Typealias (ψευδώνυμο τύπου) — μια δήλωση που εισάγει ένα εναλλακτικό όνομα για έναν υπάρχοντα τύπο. Σύνταξη: typealias ΝέοΌνομα = ΥπάρχωνΤύπος. Μετά τη δήλωση, το ΝέοΌνομα μπορεί να χρησιμοποιηθεί οπουδήποτε αναμένεται ο ΥπάρχωνΤύπος — ο μεταγλωττιστής τα αντιμετωπίζει ως τον ίδιο τύπο. Σε επίπεδο bytecode, το typealias δεν αφήνει ίχνη: όλες οι πληροφορίες για το ψευδώνυμο διαγράφονται στο στάδιο μεταγλώττισης.
Ο κύριος στόχος του typealias είναι η βελτίωση της αναγνωσιμότητας του κώδικα. Αντί για μια μακρά υπογραφή fun process(callback: (Result) -> Unit) μπορεί κανείς να γράψει typealias Callback = (Result) -> Unit και να χρησιμοποιήσει το Callback ως τύπο παραμέτρου. Αυτό είναι ιδιαίτερα χρήσιμο όταν ο ίδιος συναρτησιακός τύπος επαναλαμβάνεται σε πολλά σημεία του κώδικα: το ψευδώνυμο χρησιμεύει ως ενιαίο σημείο ορισμού και τεκμηριώνει τον σκοπό του τύπου.
Το typealias δεν δημιουργεί νέο τύπο — είναι απλώς ένα συνώνυμο. Οι μεταβλητές τύπου Callback και (Result) -> Unit είναι πλήρως εναλλάξιμες. Ο μεταγλωττιστής δεν θα δώσει σφάλμα εάν σε μια συνάρτηση που αναμένει Callback δοθεί απευθείας ένα lambda. Αυτό διακρίνει το typealias από το inline class (value class), το οποίο δημιουργεί έναν νέο τύπο-περιτύλιγμα με έλεγχο στο στάδιο μεταγλώττισης. Το typealias είναι μετονομασία, όχι περιτύλιγμα.
Το πιο συνηθισμένο σενάριο χρήσης του typealias στην Kotlin είναι οι συναρτησιακοί τύποι. Οι μακρές υπογραφές όπως (Int, String) -> Boolean ή (List
// Χωρίς typealias
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// Με typealias
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// Χρήση σε κλάση
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
Στο παράδειγμα, το typealias UserFilter κρύβει τον σύνθετο συναρτησιακό τύπο (List
Το typealias υποστηρίζει γενικευμένες παραμέτρους (generics), καθιστώντας το ακόμα πιο ευέλικτο. Μπορεί κανείς να ορίσει typealias Mapper
// Γενικευμένο typealias
typealias Mapper<T, R> = (T) -> R
typealias Provider<T> = () -> T
typealias ListTransformer<T> = (List<T>) -> List<T>
fun processNumbers(mapper: Mapper<Int, String>) {
// ο τύπος mapper είναι (Int) -> String
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
Στη λίστα, το Mapper
Οι ένθετες κλάσεις και οι μεγάλοι παραμετροποιημένοι τύποι — ένας ακόμα τομέας όπου το typealias απλοποιεί σημαντικά τον κώδικα. Εάν μια κλάση βρίσκεται βαθιά στην ιεραρχία ένθεσης (Outer.Inner.Nested), η αναφορά σε αυτήν με το πλήρες όνομα μπερδεύει τον κώδικα. Το typealias συντομεύει αυτήν την πρόσβαση και την καθιστά πιο αναγνώσιμη. Αυτό είναι ιδιαίτερα σημαντικό για κλάσεις από βιβλιοθήκες τρίτων με μακρά ονόματα.
// Ψευδώνυμο για ένθετη κλάση
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// Ψευδώνυμο για μακρύ τύπο βιβλιοθήκης
typealias UserId = Long
typealias JsonMap = Map<String, Any?>
fun process(error: NetworkError) {
println("${error.code}: ${error.message}")
}
fun parseJson(data: JsonMap): UserId {
return data["id"] as? Long ?: 0L
}
Στο παράδειγμα, NetworkError — ψευδώνυμο για την ένθετη κλάση NetworkResponse.Error. Κατά την εισαγωγή του typealias, το NetworkError μπορεί να χρησιμοποιηθεί ως συνηθισμένος τύπος, χωρίς να αποκαλύπτει την ιεραρχία ένθεσης. Το JsonMap τεκμηριώνει ότι ο χάρτης αντιπροσωπεύει ένα αντικείμενο JSON. Το UserId εξηγεί τον σκοπό του Long στο συγκεκριμένο πλαίσιο — ο αναγνώστης καταλαβαίνει αμέσως ότι πρόκειται για αναγνωριστικό χρήστη, όχι για αυθαίρετο αριθμό. Ωστόσο, το typealias δεν προστατεύει από τη μεταβίβαση ενός απλού Long εκεί όπου αναμένεται UserId — για αυτό χρειάζεται value class.
Το typealias και το inline class (value class) λύνουν διαφορετικές εργασίες, αν και και τα δύο εισάγουν ένα νέο όνομα για έναν τύπο. Το typealias είναι απλώς ένα συνώνυμο: μια μεταβλητή τύπου UserId = Long δέχεται οποιοδήποτε Long χωρίς έλεγχο. Το inline class τυλίγει την τιμή σε έναν νέο τύπο που ελέγχεται στο στάδιο μεταγλώττισης: η μεταβίβαση ενός απλού Long εκεί όπου αναμένεται inline class UserId είναι αδύνατη χωρίς ρητή μετατροπή.
| Χαρακτηριστικό | Typealias | Inline class |
|---|---|---|
| Νέος τύπος | Όχι — συνώνυμο του πρωτοτύπου | Ναι — νέος τύπος με ελέγχους |
| Απόδοση | Μηδέν — διαγράφεται πλήρως | Μηδέν — το περιτύλιγμα αφαιρείται στο bytecode |
| Κληρονομικότητα | Όχι | Όχι (final class) |
| Δικές του μέθοδοι | Όχι | Ναι — μπορούν να δηλωθούν συναρτήσεις |
| Ασφάλεια τύπου | Όχι — εναλλάξιμο με το πρωτότυπο | Ναι — ο μεταγλωττιστής διακρίνει τύπους |
Ο πίνακας δείχνει τη διαφορά μεταξύ των δύο μηχανισμών. Το typealias είναι κατάλληλο για σύντομα ονόματα και τεκμηρίωση κώδικα όταν δεν απαιτείται αυστηρή τυποποίηση. Το inline class μέσω της λέξης-κλειδιού value class (πρώην inline class) χρειάζεται όταν είναι σημαντικό να διακρίνουμε σημασιολογικά διαφορετικές τιμές του ίδιου πρωτόγονου τύπου. Για παράδειγμα, τα UserId και OrderId είναι και τα δύο Long, αλλά η μεταβίβαση του ενός εκεί όπου αναμένεται το άλλο είναι λογικό σφάλμα που το value class αποτρέπει στο στάδιο μεταγλώττισης.
Συχνές ερωτήσεις
Το import alias (import com.example.LongName as Short) λειτουργεί σε επίπεδο εισαγωγής — συντομεύει το όνομα μόνο στο τρέχον αρχείο. Το typealias δηλώνει ένα καθολικό ψευδώνυμο προσβάσιμο σε ολόκληρο το έργο μετά την εισαγωγή.
Ναι, το typealias υποστηρίζει αναδρομικούς ορισμούς για συναρτησιακούς τύπους, αλλά με προσοχή: typealias Rec
Όχι, το typealias διαγράφεται πλήρως στο στάδιο μεταγλώττισης. Στο bytecode και στον χρόνο εκτέλεσης χρησιμοποιείται ο αρχικός τύπος χωρίς κανένα περιτύλιγμα. Η απόδοση είναι ταυτόσημη με την άμεση χρήση του αρχικού τύπου.
Το typealias μπορεί να αναφέρεται σε άλλο typealias — αυτό ονομάζεται αλυσίδα ψευδωνύμων. Το βάθος της αλυσίδας τυπικά δεν είναι περιορισμένο, αλλά για αναγνωσιμότητα συνιστώνται το πολύ 2–3 επίπεδα. Ο μεταγλωττιστής αναπτύσσει πλήρως την αλυσίδα στο στάδιο ανάλυσης.
Όχι, το typealias είναι δήλωση ανώτατου επιπέδου ή μέλος κλάσης/αντικειμένου. Μέσα σε συναρτήσεις δεν μπορεί να δηλωθεί typealias. Για τοπική σύντμηση τύπων χρησιμοποιήστε import alias μέσα στο αρχείο ή μεταφέρετε το typealias σε επίπεδο μονάδας.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης