Kotlin میں ان لائن فنکشن: یہ کیا ہے، نحو اور استعمال

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

ان لائن فنکشن — ایک Kotlin میکانزم جس میں فنکشن کا جسم مرتب وقت پر براہ راست ہر کال مقام پر تبدیل ہو جاتا ہے۔ یہ لیما پیرامیٹرز کے لیے گمنام کلاسز اور آبجیکٹس بنانے کے اضافی بوجھ کو ختم کرتا ہے۔ Kotlin Documentation, 2025 کے مطابق، inline کلیدی لفظ خاص طور پر اعلیٰ ترتیب کے فنکشنز کے لیے موثر ہے، جہاں ہر لیما ان لائننگ کے بغیر ایک علیحدہ FunctionN آبجیکٹ بناتا ہے، جو کوڑا کرکٹ جمع کرنے والے پر بوجھ ڈالتا ہے۔

اہم نکات

  • ان لائن فنکشن — فنکشن جس کا جسم مرتب وقت پر کال مقام پر ان لائن کیا جاتا ہے
  • اضافی بوجھ میں کمی — لیما کے لیے گمنام کلاسز اور آبجیکٹس بنانے کو ختم کرتا ہے
  • غیر مقامی واپسی — ان لائن فنکشنز کے اندر لیما بیرونی فنکشن سے return کر سکتے ہیں
  • noinline — مخصوص لیما پیرامیٹرز کی ان لائننگ کو روکتا ہے
  • crossinline — غیر مقامی واپسی کی اجازت دیتا ہے لیکن ان لائن فنکشن سیاق سے return کو منع کرتا ہے

Kotlin میں ان لائن فنکشن کیا ہے؟

ان لائن فنکشن ایک فنکشن ہے جو inline کلیدی لفظ سے نشان زد ہوتا ہے۔ Kotlin مرتب اس کے لیے علیحدہ بائٹ کوڈ نہیں بناتا — بلکہ فنکشن کے جسم کو براہ راست ہر کال مقام پر کاپی کرتا ہے۔ بنیادی مقصد اعلیٰ ترتیب کے فنکشنز کو بہتر بنانا ہے جو لیما اظہار قبول کرتے ہیں، کیونکہ عام صورت حال میں ہر لیما ایک گمنام Function کلاس آبجیکٹ بناتا ہے۔

JetBrains Tech Blog (2024) کے مطابق، Kotlin میں ان لائن فنکشنز کا استعمال ان فنکشنز میں بنائے گئے آبجیکٹس کی تعداد کو 40–60% تک کم کر سکتا ہے جو لیما کا intensively استعمال کرتے ہیں۔ لوپس اور زیادہ بوجھ والی کارروائیوں (ترتیب دینا، مجموعوں کو فلٹر کرنا) میں یہ قابل پیمائش کارکردگی کا فائدہ فراہم کرتا ہے۔

Inline کے بغیر، ہر لیما ایک گمنام کلاس (یا ایک ترکیب شدہ فعلی انٹرفیس کی مثال) میں مرتب ہوتا ہے۔ متغیرات کو حاصل کرنے والے لیما کے لیے اضافی ریپر آبجیکٹس بنائے جاتے ہیں۔ ان لائن فنکشنز مرتب وقت پر ان تمام آبجیکٹس کو ختم کر دیتے ہیں، ان کی جگہ براہ راست کوڈ لگاتے ہیں جو ریپر کے بغیر مقامی متغیرات تک رسائی حاصل کرتا ہے۔

Inline صرف لیما پیرامیٹرز والے فنکشنز کے لیے استعمال کریں — Kotlin مرتب خود خبردار کرتا ہے اگر inline کوئی فائدہ نہیں دیتا۔

ان لائن فنکشن کا نحو اور کام کرنے کا طریقہ

بس فنکشن اعلان سے پہلے inline کلیدی لفظ شامل کریں۔ مرتب خود بخود کال مقامات پر فنکشن کے جسم کو تبدیل کر دیتا ہے۔ فنکشن خود بائٹ کوڈ میں ان صورتوں کے لیے موجود رہتا ہے جب اسے براہ راست نہ بلایا جائے (مثال کے طور پر، Java کوڈ سے)۔

kotlin
inline fun Int.repeatAction(action: (Int) -> Unit) {
    for (i in 0 until this) {
        action(i)
    }
}

// کال — لیما کوڈ فنکشن کے جسم میں ان لائن ہوتا ہے
5.repeatAction { index ->
    println("Index: $index")
}

مرتب کرنے کے بعد، اوپر کا کوڈ اس کے مساوی ہوگا:

kotlin
// ان لائننگ کے بعد کیا ہوتا ہے (منصوبہ بند طور پر):
val $this = 5
for (i in 0 until $this) {
    println("Index: $i")
}

لیما کے لیے کوئی آبجیکٹ نہیں بنایا جاتا — action کوڈ براہ راست عمل میں آتا ہے۔ یہی اصلاح کا جوہر ہے: Function.invoke() کو کال کرنے کے بجائے — لیما کے جسم کے ساتھ کوڈ کا براہ راست داخل کرنا۔

تنقیط کے ذریعے تصدیق

ان لائننگ کی تصدیق کرنے کے لیے، IntelliJ IDEA میں Tools > Kotlin > Show Kotlin Bytecode کھولیں اور Decompile پر کلک کریں۔ آپ دیکھیں گے کہ لیما کے ساتھ repeatAction کو کال کرنے کے بجائے، for لوپ کے ساتھ فنکشن کے جسم کا براہ راست داخل کیا جاتا ہے۔

لیما کے اضافی بوجھ کا مسئلہ اور اس کا حل

Kotlin میں ہر لیما تین میں سے ایک قسم میں مرتب ہوتا ہے۔ پہلا — اگر لیما متغیرات حاصل نہیں کرتا، تو یہ اس کلاس کا ایک جامد طریقہ بن جاتا ہے جہاں اس کا اعلان کیا گیا ہے۔ دوسرا — اگر یہ ایک متغیر حاصل کرتا ہے، تو ایک گمنام کلاس بنائی جاتی ہے۔ تیسرا — اگر یہ کئی متغیرات حاصل کرتا ہے، تو حاصل کردہ ہر متغیر کے لیے فیلڈز والی ایک گمنام کلاس بنائی جاتی ہے۔

لیما کی قسمInline کے بغیرInline کے ساتھ
بغیر حصولایک جامد طریقہ (دوبارہ استعمال)مکمل ان لائننگ، کال نہیں
1 متغیر کا حصولگمنام کلاس (ایک آبجیکٹ)مکمل ان لائننگ، آبجیکٹ نہیں
N متغیرات کا حصولN فیلڈز والی گمنام کلاسمکمل ان لائننگ، آبجیکٹ نہیں
تکراریعام کالinline ممنوع

Android Performance Patterns (Google, 2024) کے مطابق، مجموعوں کے intensively استعمال کرنے والی ایپلیکیشنز (فلٹرنگ، ترتیب دینا، گروپ بندی) میں ان لائن فنکشنز مختص کو 25–35% تک کم کرتے ہیں۔ اثر خاص طور پر Jetpack Compose میں نمایاں ہے، جہاں ہر حالت کی تبدیلی بہت سے لیما کے ساتھ دوبارہ تشکیل کو متحرک کرتی ہے۔

غیر مقامی واپسی اور حدود

عام فنکشن میں لیما بیرونی فنکشن سے return نہیں کر سکتا — صرف لیما سے مقامی واپسی (return@label کے ذریعے) ممکن ہے۔ ان لائن فنکشن میں، لیما کال کرنے والے فنکشن کے جسم میں ان لائن ہو جاتا ہے، اس لیے غیر مقامی واپسی ممکن ہو جاتی ہے: لیما کے اندر return بیرونی فنکشن کو ختم کر دیتا ہے۔

kotlin
inline fun findFirst(
    items: List<Int>,
    predicate: (Int) -> Boolean
): Int {
    for (item in items) {
        if (predicate(item)) {
            return item
        }
    }
    return -1
}

fun processNumbers() {
    val numbers = listOf(1, 2, 3)
    val firstEven = findFirst(numbers) { it % 2 == 0 }
    // لیما میں return processNumbers() سے null لوٹائے گا
}

غیر مقامی واپسی جلد ختم کرنے کے لیے آسان ہے، لیکن غلطیوں کا سبب بن سکتی ہے۔ اگر لیما غیر مقامی سیاق میں استعمال کیا جائے (ایک متغیر میں محفوظ)، تو غیر مقامی واپسی RuntimeException کا سبب بنے گی۔ Kotlin مرتب اس طرح کے ذخیرہ کرنے کی کوشش پر انتباہ جاری کرتا ہے۔

noinline اور crossinline: ان لائننگ کو کنٹرول کرنا

جب کسی فنکشن میں کئی لیما پیرامیٹرز ہوتے ہیں، تو کبھی کبھی صرف ان میں سے کچھ کو ان لائن کرنے کی ضرورت ہوتی ہے۔ اس کے لیے noinline استعمال کیا جاتا ہے — یہ کسی مخصوص لیما پیرامیٹر کی ان لائننگ کو روکتا ہے، اسے عام Function آبجیکٹ کے طور پر چھوڑ دیتا ہے۔

crossinline modifier الٹ مسئلہ حل کرتا ہے: لیما ان لائن ہوتا ہے، لیکن غیر مقامی واپسی ممنوع ہوتی ہے۔ یہ اس وقت ضروری ہے جب لیما کسی دوسرے لیما کے اندر یا ایسے سیاق میں استعمال ہو جہاں return کی اجازت نہ ہو (مثال کے طور پر، Runnable کو منتقل کیا گیا)۔

kotlin
inline fun processWithCallback(
    data: String,
    crossinline onSuccess: (String) -> Unit,
    noinline onError: (Exception) -> Unit
) {
    try {
        val result = process(data)
        onSuccess(result)
    } catch (e: Exception) {
        onError(e)
    }
}

// noinline: onError کو متغیر میں محفوظ یا کہیں اور منتقل کیا جا سکتا ہے
val errorHandler = { e: Exception -> log(e.message) }
processWithCallback("input", { println(it) }, errorHandler)

مثال میں، onSuccess کو crossinline کے طور پر نشان زد کیا گیا ہے — یہ ان لائن ہوگا، لیکن اس کے اندر return استعمال نہیں کیا جا سکتا۔ onError کو noinline کے طور پر نشان زد کیا گیا ہے — یہ ان لائن نہیں ہوتا، لہذا اسے آبجیکٹ کے طور پر منتقل کیا جا سکتا ہے، کلاس فیلڈ میں محفوظ کیا جا سکتا ہے، یا سننے والے کے طور پر استعمال کیا جا سکتا ہے۔

ان لائن فنکشن کی حدود اور سفارشات

ان لائن فنکشنز کی حدود ہیں۔ تکراری ان لائن فنکشنز ممنوع ہیں — مرتب غلطی لوٹائے گا۔ ان لائن فنکشنز private یا internal مرئیت نہیں رکھ سکتے اگر کسی دوسرے ماڈیول میں اعلان کیے گئے ہوں، لیکن یہ مرئیت کی حد ہے، ان لائننگ میکانزم سے متعلق نہیں۔

ہر ان لائن فنکشن کال کے ساتھ بائٹ کوڈ کا سائز بڑھتا ہے، کیونکہ جسم کاپی کیا جاتا ہے۔ Kotlin Coding Conventions (JetBrains, 2025) کے مطابق، inline صرف 10–15 سطروں تک کے فنکشنز کے لیے استعمال کرنے کی سفارش کی جاتی ہے۔ بڑے فنکشنز کے لیے، لیما ان لائننگ کا فائدہ APK سائز میں اضافے سے ختم ہو سکتا ہے (Android میں 64K طریقوں کی حد کی وجہ سے اہم)۔

kotlin
// تجویز کردہ عمل
inline fun withLock(lock: Lock, action: () -> T): T {
    lock.lock()
    try {
        return action()
    } finally {
        lock.unlock()
    }
}

// بڑے فنکشنز کے لیے تجویز نہیں کیا جاتا
inline fun largeComputation(...) { // خراب — جسم >50 سطریں
    // 50 سطروں سے زیادہ — بہتر ہے کہ عام فنکشن میں نکال لیا جائے
}

لائبریریوں میں عوامی ان لائن فنکشنز کو احتیاط کی ضرورت ہے: اگر ان لائن فنکشن کا جسم تبدیل ہوتا ہے، تو تمام کلائنٹس کو دوبارہ مرتب کرنا ہوگا۔ JetBrains ایک ماڈیول کے اندر مطابقت برقرار رکھنے کے لیے ان لائن فنکشنز سے بلائے جانے والے اراکین کے لیے @PublishedApi internal استعمال کرنے کی سفارش کرتا ہے۔

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

کیا ان لائن توسیعی فنکشن بنایا جا سکتا ہے؟

ہاں، ان لائن توسیعی فنکشن بغیر کسی پابندی کے کام کرتا ہے۔ مثال: inline fun String.transform(block: (Char) -> Char): String۔ توسیع ان لائن کرنے کی صلاحیت کو متاثر نہیں کرتی — مرتب اسے عام ان لائن فنکشن کی طرح ہینڈل کرتا ہے۔

inline کب فائدہ نہیں دیتا؟

اگر فنکشن لیما پیرامیٹرز قبول نہیں کرتا — inline کوئی فائدہ نہیں دیتا۔ Kotlin مرتب ایک انتباہ جاری کرتا ہے: “Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types.” نیز، بائٹ کوڈ بڑھنے کی وجہ سے inline بڑے فنکشنز کے لیے نقصان دہ ہے۔

inline @JvmInline (value class) سے کیسے مختلف ہے؟

inline — ایک فنکشن modifier جو فنکشن کے جسم کو کال مقام پر ان لائن کرتا ہے۔ @JvmInline (value class) — ریپر کلاسز کے لیے ایک میکانزم جو مرتب وقت پر ان کی قدر سے تبدیل ہو جاتے ہیں۔ مختلف تصورات: inline کالز کو بہتر بناتا ہے، value class ڈیٹا کی نمائندگی کو بہتر بناتا ہے۔

کیا inline کو suspend فنکشنز کے ساتھ استعمال کیا جا سکتا ہے؟

نہیں، suspend فنکشنز inline نہیں ہو سکتے کیونکہ وہ Continuation کے ساتھ ایک حالت مشین میں مرتب ہوتے ہیں۔ تاہم، ایک ان لائن فنکشن crossinline کے ساتھ پیرامیٹر کے طور پر suspend لیما قبول کر سکتا ہے۔ یہ اکثر coroutines میں استعمال ہوتا ہے: inline fun launch(block: suspend CoroutineScope.() -> Unit).

کیا inline ڈیبگنگ کو متاثر کرتا ہے؟

ہاں، ان لائن فنکشنز ڈیبگنگ کو پیچیدہ بناتے ہیں کیونکہ فنکشن کا جسم بلایا نہیں جاتا بلکہ کال مقام پر ان لائن کیا جاتا ہے۔ اسٹیک ٹریس لمبے ہو جاتے ہیں، بریک پوائنٹس کام کرتے ہیں لیکن غیر متوقع مقامات دکھا سکتے ہیں۔ JetBrains بغیر inline کے ڈیبگ کرنے اور صرف release بلڈز میں اسے فعال کرنے کی سفارش کرتا ہے۔

خلاصہ

  • ان لائن فنکشن — فنکشن کے جسم کو کال مقام پر ان لائن کرتا ہے، لیما کے اضافی بوجھ کو ختم کرتا ہے
  • غیر مقامی واپسی — لیما سے return بیرونی فنکشن کو ختم کرتا ہے (صرف inline کے ساتھ ممکن)
  • noinline — مخصوص لیما پیرامیٹر کی ان لائننگ کو روکتا ہے
  • crossinline — ان لائننگ کی اجازت دیتا ہے لیکن غیر مقامی واپسی کو منع کرتا ہے
  • تکراری فنکشنز inline نہیں ہو سکتے — مرتب غلطی لوٹاتا ہے
  • بائٹ کوڈ کا سائز بڑھتا ہے — 10–15 سطروں تک کے فنکشنز کے لیے inline استعمال کریں
  • بہترین استعمال — لیما پیرامیٹرز والے اعلیٰ ترتیب کے فنکشنز، ہم آہنگی کے بلاکس، اسکوپ فنکشنز (let, apply, also, run)

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

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

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

مزید پڑھیں