Typealias este un mecanism Kotlin pentru crearea unui nume alternativ pentru un tip existent. Cuvântul cheie typealias permite înlocuirea unei declarații de tip complexe cu un alias scurt și ușor de înțeles, fără a crea un tip nou. Conform documentației Kotlin (2026), typealias îmbunătățește lizibilitatea codului, în special în semnăturile funcțiilor cu tipuri funcționale. Typealias face codul autodocumentat, înlocuind declarațiile verbose cu tipuri denumite ușor de înțeles.
Principalele
Typealias (alias de tip) — este o declarație care introduce un nume alternativ pentru un tip existent. Sintaxa: typealias NumeNou = TipExistent. După declarație, NumeNou poate fi folosit oriunde este așteptat TipExistent — compilatorul le tratează ca același tip. La nivel de bytecode, typealias nu lasă urme: toate informațiile despre alias sunt șterse în faza de compilare.
Scopul principal al typealias este îmbunătățirea lizibilității codului. În locul unei semnături lungi fun process(callback: (Result) -> Unit) se poate scrie typealias Callback = (Result) -> Unit și folosi Callback ca tip de parametru. Acest lucru este util în special când același tip funcțional se repetă în mai multe locuri din cod: aliasul servește ca punct unic de definiție și documentează scopul tipului.
Typealias nu creează un tip nou — este doar un sinonim. Variabilele de tip Callback și (Result) -> Unit sunt complet interschimbabile. Compilatorul nu va da eroare dacă într-o funcție care așteaptă Callback este transmisă direct o lambda. Aceasta deosebește typealias de inline class (value class), care creează un nou tip-învelitor cu verificare la compilare. Typealias este o redenumire, nu o învelire.
Cel mai frecvent scenariu de utilizare a typealias în Kotlin sunt tipurile funcționale. Semnăturile lungi precum (Int, String) -> Boolean sau (List
// Fără typealias
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// Cu typealias
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// Utilizare în clasă
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
În exemplu, typealias UserFilter ascunde tipul funcțional complex (List
Typealias suportă parametri generalizați (generice), ceea ce îl face și mai flexibil. Se poate defini typealias Mapper
// Typealias generic
typealias Mapper<T, R> = (T) -> R
typealias Provider<T> = () -> T
typealias ListTransformer<T> = (List<T>) -> List<T>
fun processNumbers(mapper: Mapper<Int, String>) {
// tipul mapper este (Int) -> String
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
În listare, Mapper
Clasele imbricate și tipurile parametrizate lungi — un alt domeniu în care typealias simplifică semnificativ codul. Dacă o clasă se află adânc în ierarhia de imbricare (Outer.Inner.Nested), referirea la ea prin numele complet aglomerează codul. Typealias scurtează acest acces și îl face mai lizibil. Acest lucru este deosebit de relevant pentru clasele din biblioteci terțe cu nume lungi.
// Alias pentru clasă imbricată
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// Alias pentru tip de bibliotecă lung
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
}
În exemplu, NetworkError — un alias pentru clasa imbricată NetworkResponse.Error. La importul typealias, NetworkError poate fi folosit ca un tip obișnuit, fără a dezvălui ierarhia de imbricare. JsonMap documentează că harta reprezintă un obiect JSON. UserId explică scopul Long în contextul respectiv — cititorul înțelege imediat că este un identificator de utilizator, nu un număr arbitrar. Totuși, typealias nu protejează împotriva transmiterii unui Long obișnuit acolo unde este așteptat UserId — pentru aceasta este necesar value class.
Typealias și inline class (value class) rezolvă sarcini diferite, deși ambele introduc un nume nou pentru un tip. Typealias este doar un sinonim: variabila de tip UserId = Long acceptă orice Long fără verificare. Inline class învelește valoarea într-un tip nou care este verificat la compilare: transmiterea unui Long obișnuit acolo unde este așteptat inline class UserId este imposibilă fără o conversie explicită.
| Caracteristică | Typealias | Inline class |
|---|---|---|
| Tip nou | Nu — sinonim al originalului | Da — tip nou cu verificări |
| Performanță | Zero — se șterge complet | Zero — învelitorul se elimină în bytecode |
| Moștenire | Nu | Nu (final class) |
| Metode proprii | Nu | Da — se pot declara funcții |
| Siguranța tipurilor | Nu — interschimbabil cu originalul | Da — compilatorul diferențiază tipurile |
Tabelul arată diferența dintre cele două mecanisme. Typealias este potrivit pentru nume scurte și documentarea codului când nu este necesară o tipizare strictă. Inline class prin cuvântul cheie value class (anterior inline class) este necesar când este important să se distingă valori semantic diferite ale aceluiași tip primitiv. De exemplu, UserId și OrderId sunt ambele Long, dar transmiterea unuia acolo unde este așteptat celălalt este o eroare logică pe care value class o previne la compilare.
Întrebări frecvente
Import alias (import com.example.LongName as Short) funcționează la nivel de import — scurtează numele doar în fișierul curent. Typealias declară un alias global accesibil în întregul proiect după import.
Da, typealias suportă definiții recursive pentru tipuri funcționale, dar cu prudență: typealias Rec
Nu, typealias este complet șters în faza de compilare. În bytecode și runtime se folosește tipul original fără niciun învelitor. Performanța este identică cu utilizarea directă a tipului original.
Typealias poate face referire la un alt typealias — acesta se numește lanț de aliasuri. Adâncimea lanțului nu este limitată formal, dar pentru lizibilitate se recomandă cel mult 2–3 niveluri. Compilatorul desfășoară complet lanțul în faza de analiză.
Nu, typealias este o declarație de nivel superior sau membru al clasei/obiectului. În interiorul funcțiilor nu se poate declara typealias. Pentru scurtarea locală a tipurilor folosiți import alias în fișier sau scoateți typealias la nivel de modul.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și