Typealias موجودہ قسم کے لیے متبادل نام بنانے کا ایک Kotlin طریقہ کار ہے۔ typealias کلیدی لفظ آپ کو ایک نئی قسم بنائے بغیر پیچیدہ قسم کے اعلان کو ایک مختصر اور واضح عرفی نام سے بدلنے کی اجازت دیتا ہے۔ Kotlin دستاویزات (2026) کے مطابق، typealias کوڈ کی پڑھنے کی اہلیت کو بہتر بناتا ہے، خاص طور پر فعلی اقسام والے فنکشن دستخطوں میں۔ Typealias لمبے اعلانات کو واضح نام والی اقسام سے بدل کر کوڈ کو خود دستاویزی بناتا ہے۔
اہم نکات
Typealias (قسم کا عرفی نام) ایک اعلان ہے جو موجودہ قسم کے لیے ایک متبادل نام متعارف کراتا ہے۔ نحو: typealias نیا نام = موجودہ قسم۔ اعلان کے بعد، نیا نام وہاں استعمال کیا جا سکتا ہے جہاں موجودہ قسم کی توقع ہو — مرتب کرنے والا انہیں ایک ہی قسم سمجھتا ہے۔ بائٹ کوڈ کی سطح پر، typealias کوئی نشان نہیں چھوڑتا: تمام عرفی نام کی معلومات مرتب وقت پر مٹا دی جاتی ہے۔
Typealias کا بنیادی مقصد کوڈ پڑھنے کی اہلیت کو بہتر بنانا ہے۔ ایک لمبے دستخط fun process(callback: (Result) -> Unit) کے بجائے، آپ typealias Callback = (Result) -> Unit لکھ سکتے ہیں اور Callback کو پیرامیٹر کی قسم کے طور پر استعمال کر سکتے ہیں۔ یہ خاص طور پر مفید ہے جب ایک ہی فعلی قسم کوڈ میں کئی جگہوں پر دہرائی جائے: عرفی نام تعریف کے ایک نقطہ کے طور پر کام کرتا ہے اور قسم کے مقصد کو دستاویز کرتا ہے۔
Typealias ایک نئی قسم نہیں بناتا — یہ صرف ایک مترادف ہے۔ Callback اور (Result) -> Unit قسم کے متغیرات مکمل طور پر قابل تبادلہ ہیں۔ اگر Callback کی توقع رکھنے والے فنکشن میں براہ راست لیمبڈا بھیجا جائے تو مرتب کرنے والا غلطی نہیں دے گا۔ یہ typealias کو inline class (value class) سے ممتاز کرتا ہے، جو مرتب وقت کی جانچ کے ساتھ ایک نیا ریپر قسم بناتا ہے۔ Typealias نام بدلنا ہے، لپیٹنا نہیں۔
Kotlin میں typealias کا سب سے عام استعمال فعلی اقسام کے لیے ہے۔ (Int, String) -> Boolean یا (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 = {}
}
مثال میں، typealias UserFilter پیچیدہ فعلی قسم (List
Typealias عمومی پیرامیٹرز (جنریکس) کو سپورٹ کرتا ہے، جو اسے مزید لچکدار بناتا ہے۔ آپ 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() }
}
فہرست میں، Mapper
نیسٹڈ کلاسز اور لمبی پیرامیٹرائزڈ اقسام ایک اور شعبہ ہے جہاں typealias کوڈ کو نمایاں طور پر آسان بناتا ہے۔ اگر کوئی کلاس نیسٹنگ درجہ بندی (Outer.Inner.Nested) میں گہری ہو تو، پورے نام سے حوالہ دینا کوڈ کو بے ترتیب کر دیتا ہے۔ Typealias اس طرح کی رسائی کو مختصر کرتا ہے اور اسے مزید پڑھنے کے قابل بناتا ہے۔ یہ خاص طور پر لمبے ناموں والی تیسرے فریق کی لائبریریوں کی کلاسز کے لیے متعلقہ ہے۔
// 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
}
مثال میں، 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 ایک قدر کو ایک نئی قسم میں لپیٹتا ہے جسے مرتب وقت پر جانچا جاتا ہے: جہاں inline class UserId کی توقع ہو وہاں واضح تبدیلی کے بغیر ایک سادہ Long بھیجنا ناممکن ہے۔
| خصوصیت | Typealias | Inline class |
|---|---|---|
| نئی قسم | نہیں — اصل کا مترادف | ہاں — جانچوں کے ساتھ نئی قسم |
| کارکردگی | صفر — مکمل طور پر مٹ جاتی ہے | صفر — بائٹ کوڈ میں ریپر ہٹا دیا جاتا ہے |
| وراثت | نہیں | نہیں (حتمی کلاس) |
| اپنے طریقے | نہیں | ہاں — فنکشن اعلان کیے جا سکتے ہیں |
| قسم کی حفاظت | نہیں — اصل کے ساتھ قابل تبادلہ | ہاں — مرتب کرنے والا اقسام میں فرق کرتا ہے |
جدول دونوں میکانزم کے درمیان فرق ظاہر کرتا ہے۔ Typealias مختصر ناموں اور کوڈ دستاویز کاری کے لیے موزوں ہے جب سخت ٹائپنگ کی ضرورت نہ ہو۔ value class کلیدی لفظ (پہلے inline class) کے ذریعے Inline class کی ضرورت ہوتی ہے جب ایک ہی ابتدائی قسم کی معنوی طور پر مختلف قدروں میں فرق کرنا اہم ہو۔ مثال کے طور پر، UserId اور OrderId دونوں Long ہیں، لیکن جہاں دوسرے کی توقع ہو وہاں ایک کو بھیجنا ایک منطقی غلطی ہے جسے value class مرتب وقت پر روکتا ہے۔
اکثر پوچھے گئے سوالات
Import alias (import com.example.LongName as Short) درآمد کی سطح پر کام کرتا ہے — یہ صرف موجودہ فائل میں نام کو مختصر کرتا ہے۔ Typealias ایک عالمی عرفی نام کا اعلان کرتا ہے جو درآمد کے بعد پورے پروجیکٹ میں دستیاب ہوتا ہے۔
ہاں، typealias فعلی اقسام کے لیے تکراری تعریفات کو سپورٹ کرتا ہے، لیکن احتیاط کے ساتھ: typealias Rec
نہیں، typealias مرتب وقت پر مکمل طور پر مٹ جاتا ہے۔ بائٹ کوڈ اور رن ٹائم سطح پر بغیر کسی ریپر کے اصل قسم استعمال ہوتی ہے۔ کارکردگی اصل قسم کو براہ راست استعمال کرنے کے مترادف ہے۔
Typealias کسی دوسرے typealias کا حوالہ دے سکتا ہے — اسے عرفی ناموں کا سلسلہ کہا جاتا ہے۔ سلسلہ کی گہرائی باضابطہ طور پر لامحدود ہے، لیکن پڑھنے کی اہلیت کے لیے 2–3 سطحوں سے زیادہ کی سفارش نہیں کی جاتی۔ مرتب کرنے والا تجزیہ کے مرحلے میں سلسلہ کو مکمل طور پر حل کرتا ہے۔
نہیں، typealias ایک اعلیٰ سطحی اعلان یا کلاس/آبجیکٹ کا رکن ہے۔ فنکشن کے اندر typealias اعلان نہیں کیا جا سکتا۔ مقامی قسم مختصر کرنے کے لیے، فائل کے اندر import alias استعمال کریں یا typealias کو ماڈیول کی سطح پر رکھیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں