Typealias — mövcud tip üçün alternativ ad yaratmaq mexanizmi olan Kotlin xüsusiyyətidir. Typealias açar sözü mürəkkəb tip bəyannaməsini qısa və başa düşülən bir aliasla əvəz etməyə imkan verir, yeni tip yaratmadan. Kotlin sənədlərinə (2026) görə, typealias kodun oxunaqlılığını artırır, xüsusən funksional tipli funksiya imzalarında. Typealias kodu özünü sənədləşdirən edir, çoxsözlü bəyannamələri başa düşülən adlandırılmış tiplərlə əvəz edərək.
Əsas məqamlar
Typealias (tip aliası) — mövcud tip üçün alternativ ad təqdim edən bəyannamədir. Sintaksis: typealias YeniAd = MövcudTip. Bəyannamədən sonra YeniAd, MövcudTip-in gözlənildiyi hər yerdə istifadə edilə bilər — kompilator onları eyni tip kimi qəbul edir. Bayt-kod səviyyəsində typealias heç bir iz buraxmır: alias haqqında bütün məlumatlar kompilasiya mərhələsində silinir.
Typealias-ın əsas məqsədi kodun oxunaqlılığını yaxşılaşdırmaqdır. Uzun imza fun process(callback: (Result) -> Unit) əvəzinə typealias Callback = (Result) -> Unit yazmaq və Callback-i parametr tipi kimi istifadə etmək olar. Bu, eyni funksional tip kodun bir neçə yerində təkrarlandıqda xüsusilə faydalıdır: alias vahid təyin nöqtəsi kimi xidmət edir və tipin məqsədini sənədləşdirir.
Typealias yeni tip yaratmır — bu sadəcə sinonimdir. Callback tipi və (Result) -> Unit dəyişənləri tam qarşılıqlı əvəz olunandır. Kompilator Callback gözləyən funksiyaya birbaşa lambda ötürüldükdə səhv vermir. Bu, typealias-ı inline class-dan (value class) fərqləndirir — inline class kompilasiya mərhələsində yoxlama ilə yeni tip-sarğı yaradır. Typealias adlandırmadır, sarğı deyil.
Kotlin-də typealias-ın ən çox yayılmış istifadə ssenarisi funksional tiplərdir. (Int, String) -> Boolean və ya (List
// Typealias olmadan
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// Typealias ilə
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// Sinifdə istifadə
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
Nümunədə typealias UserFilter mürəkkəb funksional tipi (List
Typealias ümumiləşdirilmiş parametrləri (generikləri) dəstəkləyir, bu da onu daha çevik edir. typealias Mapper
// Generik 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 tipi (Int) -> String
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
Listinqdə Mapper
İç-içə siniflər və uzun parametrləşdirilmiş tiplər — typealias-ın kodu əhəmiyyətli dərəcədə sadələşdirdiyi başqa bir sahədir. Əgər sinif daxilolma iyerarxiyasında dərindirsə (Outer.Inner.Nested), ona tam adla müraciət etmək kodu qarışdırır. Typealias bu girişi qısaldır və daha oxunaqlı edir. Bu, xüsusilə uzun adları olan xarici kitabxanaların sinifləri üçün aktualdır.
// İç-içə sinif üçün alias
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// Uzun kitabxana tipi üçün alias
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ümunədə NetworkError — NetworkResponse.Error iç-içə sinfi üçün aliasdır. Typealias-ı import edərkən NetworkError-dan adi tip kimi istifadə etmək olar, daxilolma iyerarxiyasını açıqlamadan. JsonMap xəritənin JSON obyektini təmsil etdiyini sənədləşdirir. UserId konkret kontekstdə Long-un məqsədini izah edir — oxucu dərhal bunun istifadəçi identifikatoru olduğunu, ixtiyari rəqəm olmadığını başa düşür. Lakin typealias adi Long-un UserId gözlənilən yerə ötürülməsindən qorumur — bunun üçün value class lazımdır.
Typealias və inline class (value class) müxtəlif vəzifələri həll edir, hər ikisi tip üçün yeni ad təqdim etsə də. Typealias sadəcə sinonimdir: UserId = Long tipli dəyişən heç bir yoxlama olmadan istənilən Long qəbul edir. Inline class dəyəri kompilasiya mərhələsində yoxlanılan yeni tipə sarır: inline class UserId gözlənilən yerə adi Long ötürmək açıq çevrilmə olmadan mümkün deyil.
| Xüsusiyyət | Typealias | Inline class |
|---|---|---|
| Yeni tip | Xeyr — orijinalın sinonimi | Bəli — yoxlamaları olan yeni tip |
| Performans | Sıfır — tamamilə silinir | Sıfır — sarğı bayt-kodda silinir |
| Miras | Xeyr | Xeyr (final class) |
| Öz metodlar | Xeyr | Bəli — funksiyalar təyin oluna bilər |
| Tip təhlükəsizliyi | Xeyr — orijinalla əvəz olunandır | Bəli — kompilator tipləri fərqləndirir |
Cədvəl iki mexanizm arasındakı fərqi göstərir. Typealias qısa adlar və kod sənədləşdirməsi üçün uyğundur, ciddi tipizasiya tələb olunmadıqda. Inline class value class açar sözü vasitəsilə (əvvəllər inline class) eyni primitiv tipin semantik fərqli dəyərlərini ayırd etmək vacib olduqda lazımdır. Məsələn, UserId və OrderId hər ikisi Long-dur, lakin birinin digərinin gözlənildiyi yerə ötürülməsi məntiqi səhvdir, value class bunun qarşısını kompilasiya mərhələsində alır.
Tez-tez verilən suallar
Import alias (import com.example.LongName as Short) import səviyyəsində işləyir — adı yalnız cari faylda qısaldır. Typealias bütün layihədə importdan sonra əlçatan olan qlobal alias elan edir.
Bəli, typealias funksional tiplər üçün rekursiv təyinatları dəstəkləyir, lakin ehtiyatla: typealias Rec
Xeyr, typealias kompilasiya mərhələsində tamamilə silinir. Bayt-kodda və runtime-da heç bir sarğı olmadan orijinal tip istifadə olunur. Performans orijinal tipin birbaşa istifadəsi ilə eynidir.
Typealias başqa bir typealias-a istinad edə bilər — bu aliaslar zənciri adlanır. Zəncirin dərinliyi formal olaraq məhdud deyil, lakin oxunaqlılıq üçün 2–3 səviyyədən çox olmaması tövsiyə olunur. Kompilator zənciri analiz mərhələsində tamamilə açır.
Xeyr, typealias yuxarı səviyyəli bəyannamə və ya sinif/obyekt üzvüdür. Funksiyalar daxilində typealias elan etmək mümkün deyil. Tipləri lokal qısaltmaq üçün fayl daxilində import alias-dan istifadə edin və ya typealias-ı modul səviyyəsinə çıxarın.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun