extension property — ایک Kotlin طریقہ کار جو وراثت کے بغیر اور سورس کوڈ میں تبدیلی کے بغیر موجودہ کلاسز میں نئی خصوصیات شامل کرنے کی اجازت دیتا ہے۔ extension functions کے برعکس، extension properties حالت ذخیرہ نہیں کر سکتیں — یہ صرف getter اور اختیاری طور پر setter کے ساتھ اعلان کی جاتی ہیں، کیونکہ ان کے پاس backing field نہیں ہوتا۔ Kotlin Documentation, 2025 کے مطابق، extension properties جامد getter اور setter طریقوں میں مرتب ہوتی ہیں جہاں receiver پہلا پیرامیٹر ہوتا ہے۔
اہم نکات
Extension property Kotlin میں ایک نحوی تعمیر ہے جو اس کے اعلان کو تبدیل کیے بغیر موجودہ قسم میں ایک خصوصیت شامل کرتی ہے۔ خصوصیت receiver type کے ساتھ اعلان کی جاتی ہے اور اس میں getter ہونا ضروری ہے۔ عام خصوصیات سے اہم فرق backing field کی عدم موجودگی ہے: extension property ڈیٹا ذخیرہ نہیں کر سکتی، صرف receiver آبجیکٹ کی بنیاد پر حساب کر سکتی ہے۔
Kotlin Foundation سروے (2024) کے مطابق، extension properties extension functions سے کم مقبول ہیں — تقریباً 45% ڈویلپر انہیں باقاعدگی سے استعمال کرتے ہیں۔ اس کی وجہ حالت نہ ہونے کی حد ہے، جو اطلاق کے دائرہ کار کو محدود کرتی ہے۔ اس کے باوجود، حسابی خصوصیات کے لیے جو منطقی طور پر ایک قسم سے منسلک ہیں، extension properties سب سے مختصر آپشن ہیں۔
Extension properties جامد getter اور setter طریقوں کے جوڑے میں مرتب ہوتی ہیں۔ بائٹ کوڈ کی سطح پر، extension property اور extension function کو کال کرنے میں کوئی فرق نہیں ہے — دونوں receiver پیرامیٹر کے ساتھ جامد طریقے بن جاتے ہیں۔ JetBrains (Kotlin Docs, 2025) کے مطابق، کوئی اضافی بوجھ نہیں ہے۔
مختصر حسابی اقدار کے لیے extension properties استعمال کریں جو طریقہ کالز کی بجائے خصوصیات کی طرح نظر آئیں — اس سے کوڈ کی پڑھنے کی اہلیت بہتر ہوتی ہے اور یکساں رسائی کے اصول کی پیروی ہوتی ہے۔
Extension property کا اعلان کرنے کے لیے، عام خصوصیت کی طرح نحو استعمال کریں، لیکن receiver type کے سابقہ کے ساتھ۔ val لازمی getter کے ساتھ صرف پڑھنے کے قابل extension property کا اعلان کرتا ہے، var getter اور اختیاری setter کے ساتھ قابل تبدیلی کا اعلان کرتا ہے۔
// صرف پڑھنے کے قابل extension property
val String.isEmail: Boolean
get() = this.contains("@") && this.contains(".")
// کال
val valid = "test@test.com".isEmail
نوٹ: extension property کو قوسین کے بغیر بلایا جاتا ہے — str.isEmail، str.isEmail() نہیں۔ یہ extension property اور extension function کے درمیان اہم فرق ہے: خصوصیت ایک فیلڈ کی طرح نظر آتی ہے، حالانکہ حقیقت میں یہ getter کے ذریعے حسابی ہوتی ہے۔
Extension properties عمومی ہو سکتی ہیں — receiver عمومی قسم کے پیرامیٹر استعمال کر سکتا ہے۔ یہ عالمی خصوصیات بنانے کی اجازت دیتا ہے جو کسی بھی مجموعہ کی قسم کے ساتھ کام کرتی ہیں۔
val List<T>.secondOrNull: T?
get() = if (size >= 2) this[1] else null
val items = listOf("a", "b", "c")
val second = items.secondOrNull // "b"
secondOrNull خصوصیت کسی بھی قسم T کے لیے کام کرتی ہے، فہرست کا دوسرا عنصر لوٹاتی ہے یا null اگر دو سے کم عناصر ہوں۔ یہ ایک عام مثال ہے جہاں extension property فنکشن سے زیادہ مناسب ہے — اس تک رسائی فیلڈ پڑھنے کی طرح لگتی ہے۔
Extension property میں backing field نہیں ہو سکتا کیونکہ یہ کلاس کے میٹا ڈیٹا میں شامل نہیں ہوتی — یہ صرف جامد getter/setter فنکشنز کے جوڑے کے طور پر موجود ہوتی ہے۔ Backing field (Kotlin میں field کلیدی لفظ) کلاس کا ایک اندرونی فیلڈ ہے جو خصوصیت کی قدر ذخیرہ کرتا ہے۔ Extension property کو کلاس کے اندرونی ڈھانچے تک رسائی نہیں ہے۔
// ❌ خرابی: extension property میں backing field نہیں ہو سکتا
var String.cachedValue: String
get() = "computed"
set(value) {
field = value // فیلڈ قابل رسائی نہیں!
}
// ✅ درست: بیرونی ذخیرہ استعمال کریں
val cache = MutableMap<String, String>()
var String.cachedValue: String
get() = cache[this] ?: ""
set(value) { cache[this] = value }
مثال میں ایک بیرونی Map ذخیرہ کرنے کا مسئلہ حل کرتی ہے لیکن دوسرا مسئلہ پیدا کرتی ہے — میموری لیک۔ Extension property کے ذریعے حاصل کردہ اقدار Map میں ہمیشہ زندہ رہتی ہیں اگر صاف نہ کی جائیں۔ یہ حد extension properties کو کیشنگ یا عارضی ڈیٹا ذخیرہ کرنے کے لیے نامناسب بناتی ہے۔
کیشنگ کے لیے، WeakHashMap یا خودکار صفائی کے طریقہ کار استعمال کرنے کی سفارش کی جاتی ہے۔ JetBrains پروڈکشن کوڈ میں بیرونی ذخیرہ کے ساتھ var extension properties کے استعمال سے بچنے کی سفارش کرتا ہے بغیر محتاط زندگی کے دورانیے کے انتظام کے۔
Extension property اور extension function کے درمیان انتخاب معنوں پر منحصر ہے: خصوصیت کسی آبجیکٹ کی خاصیت بیان کرتی ہے، جبکہ فنکشن ایک عمل بیان کرتا ہے۔ یکساں رسائی کا اصول کہتا ہے: کلائنٹ کو یہ نہیں جاننا چاہیے کہ قدر حسابی ہے یا ذخیرہ شدہ۔ اگر قدر کو خاصیت (لمبائی، حجم، حالت) کے طور پر پیش کیا جا سکتا ہے — خصوصیت استعمال کریں۔
| معیار | Extension property | Extension function |
|---|---|---|
| کال | قوسین کے بغیر: obj.property | قوسین کے ساتھ: obj.function() |
| معنی | خاصیت، وصف | عمل، کارروائی |
| Backing field | معاونت یافتہ نہیں | لاگو نہیں |
| پیرامیٹر | صرف getter/setter | کوئی بھی پیرامیٹر |
| کارکردگی | یکساں (جامد طریقہ) | یکساں (جامد طریقہ) |
| مثال | text.length | text.isEmail() |
قاعدہ سادہ ہے: اگر عمل پیرامیٹر لیتا ہے — extension function استعمال کریں۔ اگر یہ پیرامیٹر کے بغیر سادہ حسابی قدر ہے — extension property استعمال کریں۔ Android Architecture Guide (Google, 2025) کے مطابق، ڈیٹا تک رسائی کے لیے extension properties اور ضمنی اثرات والے عمل کے لیے extension functions کو ترجیح دی جانی چاہیے۔
var کلیدی لفظ کے ساتھ extension property setter کو سپورٹ کرتی ہے، لیکن قدر ذخیرہ کرنے کی صلاحیت کے بغیر — setter عام طور پر ایک ضمنی اثر انجام دیتا ہے یا بیرونی ذخیرہ میں ڈیٹا محفوظ کرتا ہے۔ نحو قابل تبدیلی کلاس خصوصیات کی طرح ہے۔
// setter کے ساتھ قابل تبدیلی extension property
var StringBuilder.lastChar: Char
get() = this[length - 1]
set(value) {
this.setCharAt(length - 1, value)
}
val sb = StringBuilder("Kotlin")
println(sb.lastChar) // n
sb.lastChar = '!'
println(sb) // Kotli!
lastChar خصوصیت Kotlin دستاویزات سے ایک کلاسک مثال ہے۔ Getter StringBuilder کا آخری حرف لوٹاتا ہے، setter اسے نئی قدر سے بدل دیتا ہے۔ نوٹ: حالت علیحدہ فیلڈ میں نہیں بلکہ خود StringBuilder میں (setCharAt کے ذریعے) محفوظ ہے — یہ extension property کا درست استعمال ہے۔
حقیقی پروجیکٹس میں، extension properties زیادہ تر مجموعہ ڈیٹا تک رسائی آسان بنانے، UI عناصر کے سائز یا حالت کا حساب لگانے، اور موجودہ کلاسز کے اوپر آسان API بنانے کے لیے استعمال ہوتی ہیں۔ Kotlin معیاری لائبریری فعال طور پر اس طریقہ کار کو استعمال کرتی ہے: مجموعہ کے لیے size، indices، lastIndex — یہ extension properties ہیں۔
// مجموعہ کے لیے extension properties
val List<Int>.sumFast: Int
get() = fold(0) { acc, i -> acc + i }
val String.half: String
get() = this.substring(0, length / 2)
// Android View کے لیے extension property
val View.isVisible: Boolean
get() = visibility == View.VISIBLE
// محفوظ receiver کے ذریعے null جانچ
val String?.isNullOrBlank: Boolean
get() = this == null || this.isBlank()
View کے لیے extension property isVisible — ایک مثال جو ہر Android ڈویلپر کو معلوم ہونی چاہیے۔ view.visibility == View.VISIBLE کے بجائے آپ view.isVisible لکھ سکتے ہیں۔ یہ نہ صرف چھوٹا ہے بلکہ قدرتی زبان کی طرح پڑھا جاتا ہے: «اگر view نظر آرہا ہے»۔ سادگی کے باوجود، ایسی خصوصیات کوڈ کی پڑھنے کی اہلیت کو نمایاں طور پر بہتر کرتی ہیں۔
اکثر پوچھے گئے سوالات
نہیں، extension properties کو companion object یا object declaration کے لیے اعلان نہیں کیا جا سکتا۔ توسیع کا طریقہ کار صرف کلاسز، انٹرفیسز اور nullable اقسام پر لاگو ہوتا ہے۔ object کے لیے، عام اعلیٰ سطحی فنکشن استعمال کریں۔
Inline property (inline modifier کے ساتھ) — ایک Kotlin طریقہ کار ہے جو خصوصیت کا آبجیکٹ بنائے بغیر getter/setter کو کال کرتا ہے۔ Extension property ہمیشہ ایک جامد طریقہ میں مرتب ہوتی ہے، جبکہ inline property بغیر ریپر کے کال میں مرتب ہوتی ہے۔ یہ مختلف مسائل حل کرتی ہیں: extension property موجودہ قسم میں خصوصیت شامل کرتی ہے، inline — اپنی خصوصیات کی کالز کو بہتر بناتی ہے۔
ہاں، extension property میں تشریحات ہو سکتی ہیں، لیکن صرف اعلان کی سطح پر۔ عام کلاس خصوصیات کے برعکس، extension property کے getter یا setter کو علیحدہ تشریح نہیں دی جا سکتی۔ مثال: @JvmName("getIsValid") val String.isValid get() = true.
نہیں، extension properties کو companion object کے ساتھ receiver کے طور پر اعلان نہیں کیا جا سکتا۔ یہ زبان کی ایک حد ہے — extension property صرف قسم کی مثالوں کے ساتھ کام کرتی ہے، جبکہ companion object ایک جامد سیاق و سباق ہے۔ اعلیٰ سطحی extension فنکشنز یا مستقل استعمال کریں۔
کم سے کم۔ ہر extension property مرتب شدہ بائٹ کوڈ میں ایک جامد getter طریقہ (اور اختیاری طور پر setter) شامل کرتی ہے۔ موازنہ کے لیے، اسی خصوصیت کے ساتھ ریپر کلاس بنانا ایک پوری کلاس شامل کرتا ہے۔ Extension properties فعالیت بڑھانے کا ایک ہلکا طریقہ ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں