Typealias, mevcut bir tür için alternatif bir ad oluşturmaya yarayan bir Kotlin mekanizmasıdır. typealias anahtar sözcüğü, yeni bir tür oluşturmadan karmaşık bir tür bildirimini kısa ve net bir takma adla değiştirmenize olanak tanır. Kotlin belgelerine (2026) göre, typealias özellikle işlevsel türlere sahip işlev imzalarında kod okunabilirliğini artırır. Typealias, uzun bildirimleri net adlandırılmış türlerle değiştirerek kodu kendi kendini belgeleyen hale getirir.
Önemli Noktalar
Typealias (tür takma adı), mevcut bir tür için alternatif bir ad tanıtan bir bildirimdir. Sözdizimi: typealias YeniAd = MevcutTür. Bildirimden sonra, YeniAd, MevcutTür’ün beklendiği her yerde kullanılabilir — derleyici onları aynı tür olarak ele alır. Bayt kodu düzeyinde, typealias hiçbir iz bırakmaz: tüm takma ad bilgileri derleme zamanında silinir.
Typealias’in temel amacı kod okunabilirliğini artırmaktır. Uzun bir imza olan fun process(callback: (Result) -> Unit) yerine, typealias Callback = (Result) -> Unit yazıp Callback’i parametre türü olarak kullanabilirsiniz. Bu, aynı işlevsel tür kodda birden çok yerde tekrarlandığında özellikle kullanışlıdır: takma ad, tek bir tanımlama noktası görevi görür ve türün amacını belgeler.
Typealias yeni bir tür oluşturmaz — sadece bir eşanlamlıdır. Callback ve (Result) -> Unit türündeki değişkenler tamamen değiştirilebilir. Callback bekleyen bir işleve doğrudan bir lambda aktarılırsa derleyici hata vermez. Bu, typealias’i derleme zamanı denetimi olan yeni bir sarmalayıcı tür oluşturan inline class’tan (value class) ayırır. Typealias yeniden adlandırmadır, sarmalama değildir.
Kotlin’de typealias’in en yaygın kullanım durumu işlevsel türlerdir. (Int, String) -> Boolean veya (List
// Without typealias
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// With typealias
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// Usage in class
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
Örnekte, UserFilter typealias’i karmaşık işlevsel türü (List
Typealias genel parametreleri (generics) destekler, bu da onu daha da esnek hale getirir. typealias Mapper
// Generic 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 type is (Int) -> String
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
Listede, Mapper
İç içe sınıflar ve uzun parametrelendirilmiş türler, typealias’in kodu önemli ölçüde basitleştirdiği bir diğer alandır. Bir sınıf, iç içe geçme hiyerarşisinde (Outer.Inner.Nested) derinse, tam adıyla başvurmak kodu karmaşık hale getirir. Typealias bu tür erişimi kısaltır ve daha okunabilir hale getirir. Bu, özellikle uzun adlara sahip üçüncü taraf kütüphanelerdeki sınıflar için geçerlidir.
// Alias for nested class
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// Alias for long library type
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
}
Örnekte, NetworkError iç içe sınıf NetworkResponse.Error için bir takma addır. Typealias’i içe aktararak, iç içe geçme hiyerarşisini açığa çıkarmadan NetworkError’u normal bir tür olarak kullanabilirsiniz. JsonMap, haritanın bir JSON nesnesini temsil ettiğini belgeler. UserId, Long’un belirli bir bağlamdaki amacını netleştirir — okuyucu bunun rastgele bir sayı değil, bir kullanıcı tanımlayıcısı olduğunu hemen anlar. Ancak typealias, UserId’nin beklendiği yere düz bir Long aktarılmasını engellemez — bunun için bir value class gerekir.
Typealias ve inline class (value class), her ikisi de bir tür için yeni bir ad tanıtmasına rağmen farklı sorunları çözer. Typealias sadece bir eşanlamlıdır: UserId = Long türündeki bir değişken, denetim olmadan herhangi bir Long’u kabul eder. Inline class, bir değeri derleme zamanında denetlenen yeni bir tür içine sarar: açık dönüştürme olmadan, inline class UserId’nin beklendiği yere düz bir Long aktarılamaz.
| Özellik | Typealias | Inline class |
|---|---|---|
| Yeni tür | Hayır — orijinalin eşanlamlısı | Evet — denetimlerle yeni tür |
| Performans | Sıfır — tamamen silinir | Sıfır — bayt kodunda sarmalayıcı kaldırılır |
| Kalıtım | Hayır | Hayır (son sınıf) |
| Kendi yöntemleri | Hayır | Evet — işlevler bildirilebilir |
| Tür güvenliği | Hayır — orijinallerle değiştirilebilir | Evet — derleyici türleri ayırt eder |
Tablo iki mekanizma arasındaki farkı gösterir. Typealias, katı türleme gerekmediğinde kısa adlar ve kod belgeleme için uygundur. value class anahtar sözcüğü (eski adıyla inline class) aracılığıyla Inline class, aynı ilkel türün anlamsal olarak farklı değerlerini ayırt etmenin önemli olduğu durumlarda gereklidir. Örneğin, UserId ve OrderId her ikisi de Long’dur, ancak birinin beklendiği yere diğerini aktarmak, value class’ın derleme zamanında önlediği mantıksal bir hatadır.
Sıkça Sorulan Sorular
Import alias (import com.example.LongName as Short) içe aktarma düzeyinde çalışır — adı yalnızca geçerli dosyada kısaltır. Typealias, içe aktarmadan sonra proje genelinde kullanılabilen küresel bir takma ad bildirir.
Evet, typealias işlevsel türler için özyinelemeli tanımları destekler, ancak dikkatli olun: typealias Rec
Hayır, typealias derleme zamanında tamamen silinir. Bayt kodu ve çalışma zamanı düzeyinde herhangi bir sarmalayıcı olmadan orijinal tür kullanılır. Performans, orijinal türü doğrudan kullanmakla aynıdır.
Typealias başka bir typealias’e başvurabilir — buna takma ad zinciri denir. Zincirin derinliği resmi olarak sınırsızdır, ancak okunabilirlik için 2–3 seviyeden fazlası önerilmez. Derleyici, analiz aşamasında zinciri tamamen çözer.
Hayır, typealias üst düzey bir bildirim veya bir sınıf/nesne üyesidir. Typealias işlevlerin içinde bildirilemez. Yerel tür kısaltması için, dosya içinde import alias kullanın veya typealias’i modül düzeyine yerleştirin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun