Kotlin میں Extension property — یہ کیا ہے، نحو اور استعمال

مصنف: IT Sectr اشاعت: 2026-06-21 مطالعے کا وقت: 8 منٹ

extension property — ایک Kotlin طریقہ کار جو وراثت کے بغیر اور سورس کوڈ میں تبدیلی کے بغیر موجودہ کلاسز میں نئی خصوصیات شامل کرنے کی اجازت دیتا ہے۔ extension functions کے برعکس، extension properties حالت ذخیرہ نہیں کر سکتیں — یہ صرف getter اور اختیاری طور پر setter کے ساتھ اعلان کی جاتی ہیں، کیونکہ ان کے پاس backing field نہیں ہوتا۔ Kotlin Documentation, 2025 کے مطابق، extension properties جامد getter اور setter طریقوں میں مرتب ہوتی ہیں جہاں receiver پہلا پیرامیٹر ہوتا ہے۔

اہم نکات

  • Extension property — receiver type کے ساتھ ایک خصوصیت، Kotlin خصوصیت کے نحو کے ذریعے قابل رسائی
  • کوئی backing field نہیں — extension property حالت ذخیرہ نہیں کر سکتی، صرف حساب کر سکتی ہے
  • Getter لازمی، setter اختیاری — عام extension functions کی طرح اعلان کیا جاتا ہے
  • Nullable اقسام معاونت یافتہ: receiver اندرونی جانچ کے ساتھ nullable ہو سکتا ہے
  • قابل تبدیلی extension property — صرف جب getter اور setter کے ساتھ var کے طور پر اعلان کیا جائے

Kotlin میں extension property کیا ہے؟

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 کا نحو: val اور var

Extension property کا اعلان کرنے کے لیے، عام خصوصیت کی طرح نحو استعمال کریں، لیکن receiver type کے سابقہ کے ساتھ۔ val لازمی getter کے ساتھ صرف پڑھنے کے قابل extension property کا اعلان کرتا ہے، var getter اور اختیاری setter کے ساتھ قابل تبدیلی کا اعلان کرتا ہے۔

kotlin
// صرف پڑھنے کے قابل 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 property

Extension properties عمومی ہو سکتی ہیں — receiver عمومی قسم کے پیرامیٹر استعمال کر سکتا ہے۔ یہ عالمی خصوصیات بنانے کی اجازت دیتا ہے جو کسی بھی مجموعہ کی قسم کے ساتھ کام کرتی ہیں۔

kotlin
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 حالت کیوں ذخیرہ نہیں کر سکتی

Extension property میں backing field نہیں ہو سکتا کیونکہ یہ کلاس کے میٹا ڈیٹا میں شامل نہیں ہوتی — یہ صرف جامد getter/setter فنکشنز کے جوڑے کے طور پر موجود ہوتی ہے۔ Backing field (Kotlin میں field کلیدی لفظ) کلاس کا ایک اندرونی فیلڈ ہے جو خصوصیت کی قدر ذخیرہ کرتا ہے۔ Extension property کو کلاس کے اندرونی ڈھانچے تک رسائی نہیں ہے۔

kotlin
// ❌ خرابی: 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 کے درمیان انتخاب معنوں پر منحصر ہے: خصوصیت کسی آبجیکٹ کی خاصیت بیان کرتی ہے، جبکہ فنکشن ایک عمل بیان کرتا ہے۔ یکساں رسائی کا اصول کہتا ہے: کلائنٹ کو یہ نہیں جاننا چاہیے کہ قدر حسابی ہے یا ذخیرہ شدہ۔ اگر قدر کو خاصیت (لمبائی، حجم، حالت) کے طور پر پیش کیا جا سکتا ہے — خصوصیت استعمال کریں۔

معیارExtension propertyExtension function
کالقوسین کے بغیر: obj.propertyقوسین کے ساتھ: obj.function()
معنیخاصیت، وصفعمل، کارروائی
Backing fieldمعاونت یافتہ نہیںلاگو نہیں
پیرامیٹرصرف getter/setterکوئی بھی پیرامیٹر
کارکردگییکساں (جامد طریقہ)یکساں (جامد طریقہ)
مثالtext.lengthtext.isEmail()

قاعدہ سادہ ہے: اگر عمل پیرامیٹر لیتا ہے — extension function استعمال کریں۔ اگر یہ پیرامیٹر کے بغیر سادہ حسابی قدر ہے — extension property استعمال کریں۔ Android Architecture Guide (Google, 2025) کے مطابق، ڈیٹا تک رسائی کے لیے extension properties اور ضمنی اثرات والے عمل کے لیے extension functions کو ترجیح دی جانی چاہیے۔

var اور setter کے ساتھ قابل تبدیلی extension property

var کلیدی لفظ کے ساتھ extension property setter کو سپورٹ کرتی ہے، لیکن قدر ذخیرہ کرنے کی صلاحیت کے بغیر — setter عام طور پر ایک ضمنی اثر انجام دیتا ہے یا بیرونی ذخیرہ میں ڈیٹا محفوظ کرتا ہے۔ نحو قابل تبدیلی کلاس خصوصیات کی طرح ہے۔

kotlin
// 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 کے عملی مثالیں

حقیقی پروجیکٹس میں، extension properties زیادہ تر مجموعہ ڈیٹا تک رسائی آسان بنانے، UI عناصر کے سائز یا حالت کا حساب لگانے، اور موجودہ کلاسز کے اوپر آسان API بنانے کے لیے استعمال ہوتی ہیں۔ Kotlin معیاری لائبریری فعال طور پر اس طریقہ کار کو استعمال کرتی ہے: مجموعہ کے لیے size، indices، lastIndex — یہ extension properties ہیں۔

kotlin
// مجموعہ کے لیے 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 نظر آرہا ہے»۔ سادگی کے باوجود، ایسی خصوصیات کوڈ کی پڑھنے کی اہلیت کو نمایاں طور پر بہتر کرتی ہیں۔

اکثر پوچھے گئے سوالات

کیا companion object کے لیے extension property کا اعلان کیا جا سکتا ہے؟

نہیں، extension properties کو companion object یا object declaration کے لیے اعلان نہیں کیا جا سکتا۔ توسیع کا طریقہ کار صرف کلاسز، انٹرفیسز اور nullable اقسام پر لاگو ہوتا ہے۔ object کے لیے، عام اعلیٰ سطحی فنکشن استعمال کریں۔

Extension property inline property سے کیسے مختلف ہے؟

Inline property (inline modifier کے ساتھ) — ایک Kotlin طریقہ کار ہے جو خصوصیت کا آبجیکٹ بنائے بغیر getter/setter کو کال کرتا ہے۔ Extension property ہمیشہ ایک جامد طریقہ میں مرتب ہوتی ہے، جبکہ inline property بغیر ریپر کے کال میں مرتب ہوتی ہے۔ یہ مختلف مسائل حل کرتی ہیں: extension property موجودہ قسم میں خصوصیت شامل کرتی ہے، inline — اپنی خصوصیات کی کالز کو بہتر بناتی ہے۔

کیا extension properties تشریحات (annotations) کو سپورٹ کرتی ہیں؟

ہاں، extension property میں تشریحات ہو سکتی ہیں، لیکن صرف اعلان کی سطح پر۔ عام کلاس خصوصیات کے برعکس، extension property کے getter یا setter کو علیحدہ تشریح نہیں دی جا سکتی۔ مثال: @JvmName("getIsValid") val String.isValid get() = true.

کیا کسی کلاس کے companion object کے ساتھ extension property استعمال کی جا سکتی ہے؟

نہیں، extension properties کو companion object کے ساتھ receiver کے طور پر اعلان نہیں کیا جا سکتا۔ یہ زبان کی ایک حد ہے — extension property صرف قسم کی مثالوں کے ساتھ کام کرتی ہے، جبکہ companion object ایک جامد سیاق و سباق ہے۔ اعلیٰ سطحی extension فنکشنز یا مستقل استعمال کریں۔

کیا extension property APK کے سائز کو متاثر کرتی ہے؟

کم سے کم۔ ہر extension property مرتب شدہ بائٹ کوڈ میں ایک جامد getter طریقہ (اور اختیاری طور پر setter) شامل کرتی ہے۔ موازنہ کے لیے، اسی خصوصیت کے ساتھ ریپر کلاس بنانا ایک پوری کلاس شامل کرتا ہے۔ Extension properties فعالیت بڑھانے کا ایک ہلکا طریقہ ہے۔

خلاصہ

  • Extension property — وراثت کے بغیر موجودہ قسم کے لیے حسابی خصوصیت
  • کوئی backing field نہیں — حالت ذخیرہ نہیں ہوتی، صرف getter کے ذریعے حسابی ہوتی ہے
  • setter کے ساتھ var — ممکن ہے، لیکن ڈیٹا لکھنے کے لیے بیرونی ذخیرہ درکار ہے
  • نحو — receiver type اور لازمی getter کے ساتھ val/var
  • کارکردگی — صفر اضافی بوجھ، جامد طریقہ میں مرتب ہوتی ہے
  • استعمال — حسابی خصوصیات: لمبائی، حالت، حجم، جانچ
  • حد — حالت ذخیرہ کرنے، میموری انتظام کے بغیر کیشنگ کے لیے موزوں نہیں

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں