ان لائن فنکشن — ایک Kotlin میکانزم جس میں فنکشن کا جسم مرتب وقت پر براہ راست ہر کال مقام پر تبدیل ہو جاتا ہے۔ یہ لیما پیرامیٹرز کے لیے گمنام کلاسز اور آبجیکٹس بنانے کے اضافی بوجھ کو ختم کرتا ہے۔ Kotlin Documentation, 2025 کے مطابق، inline کلیدی لفظ خاص طور پر اعلیٰ ترتیب کے فنکشنز کے لیے موثر ہے، جہاں ہر لیما ان لائننگ کے بغیر ایک علیحدہ FunctionN آبجیکٹ بناتا ہے، جو کوڑا کرکٹ جمع کرنے والے پر بوجھ ڈالتا ہے۔
اہم نکات
ان لائن فنکشن ایک فنکشن ہے جو inline کلیدی لفظ سے نشان زد ہوتا ہے۔ Kotlin مرتب اس کے لیے علیحدہ بائٹ کوڈ نہیں بناتا — بلکہ فنکشن کے جسم کو براہ راست ہر کال مقام پر کاپی کرتا ہے۔ بنیادی مقصد اعلیٰ ترتیب کے فنکشنز کو بہتر بنانا ہے جو لیما اظہار قبول کرتے ہیں، کیونکہ عام صورت حال میں ہر لیما ایک گمنام Function کلاس آبجیکٹ بناتا ہے۔
JetBrains Tech Blog (2024) کے مطابق، Kotlin میں ان لائن فنکشنز کا استعمال ان فنکشنز میں بنائے گئے آبجیکٹس کی تعداد کو 40–60% تک کم کر سکتا ہے جو لیما کا intensively استعمال کرتے ہیں۔ لوپس اور زیادہ بوجھ والی کارروائیوں (ترتیب دینا، مجموعوں کو فلٹر کرنا) میں یہ قابل پیمائش کارکردگی کا فائدہ فراہم کرتا ہے۔
Inline کے بغیر، ہر لیما ایک گمنام کلاس (یا ایک ترکیب شدہ فعلی انٹرفیس کی مثال) میں مرتب ہوتا ہے۔ متغیرات کو حاصل کرنے والے لیما کے لیے اضافی ریپر آبجیکٹس بنائے جاتے ہیں۔ ان لائن فنکشنز مرتب وقت پر ان تمام آبجیکٹس کو ختم کر دیتے ہیں، ان کی جگہ براہ راست کوڈ لگاتے ہیں جو ریپر کے بغیر مقامی متغیرات تک رسائی حاصل کرتا ہے۔
Inline صرف لیما پیرامیٹرز والے فنکشنز کے لیے استعمال کریں — Kotlin مرتب خود خبردار کرتا ہے اگر inline کوئی فائدہ نہیں دیتا۔
بس فنکشن اعلان سے پہلے inline کلیدی لفظ شامل کریں۔ مرتب خود بخود کال مقامات پر فنکشن کے جسم کو تبدیل کر دیتا ہے۔ فنکشن خود بائٹ کوڈ میں ان صورتوں کے لیے موجود رہتا ہے جب اسے براہ راست نہ بلایا جائے (مثال کے طور پر، Java کوڈ سے)۔
inline fun Int.repeatAction(action: (Int) -> Unit) {
for (i in 0 until this) {
action(i)
}
}
// کال — لیما کوڈ فنکشن کے جسم میں ان لائن ہوتا ہے
5.repeatAction { index ->
println("Index: $index")
}
مرتب کرنے کے بعد، اوپر کا کوڈ اس کے مساوی ہوگا:
// ان لائننگ کے بعد کیا ہوتا ہے (منصوبہ بند طور پر):
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 بیرونی فنکشن کو ختم کر دیتا ہے۔
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 استعمال کیا جاتا ہے — یہ کسی مخصوص لیما پیرامیٹر کی ان لائننگ کو روکتا ہے، اسے عام Function آبجیکٹ کے طور پر چھوڑ دیتا ہے۔
crossinline modifier الٹ مسئلہ حل کرتا ہے: لیما ان لائن ہوتا ہے، لیکن غیر مقامی واپسی ممنوع ہوتی ہے۔ یہ اس وقت ضروری ہے جب لیما کسی دوسرے لیما کے اندر یا ایسے سیاق میں استعمال ہو جہاں return کی اجازت نہ ہو (مثال کے طور پر، Runnable کو منتقل کیا گیا)۔
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 طریقوں کی حد کی وجہ سے اہم)۔
// تجویز کردہ عمل
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 کوئی فائدہ نہیں دیتا۔ Kotlin مرتب ایک انتباہ جاری کرتا ہے: “Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types.” نیز، بائٹ کوڈ بڑھنے کی وجہ سے inline بڑے فنکشنز کے لیے نقصان دہ ہے۔
inline — ایک فنکشن modifier جو فنکشن کے جسم کو کال مقام پر ان لائن کرتا ہے۔ @JvmInline (value class) — ریپر کلاسز کے لیے ایک میکانزم جو مرتب وقت پر ان کی قدر سے تبدیل ہو جاتے ہیں۔ مختلف تصورات: inline کالز کو بہتر بناتا ہے، value class ڈیٹا کی نمائندگی کو بہتر بناتا ہے۔
نہیں، suspend فنکشنز inline نہیں ہو سکتے کیونکہ وہ Continuation کے ساتھ ایک حالت مشین میں مرتب ہوتے ہیں۔ تاہم، ایک ان لائن فنکشن crossinline کے ساتھ پیرامیٹر کے طور پر suspend لیما قبول کر سکتا ہے۔ یہ اکثر coroutines میں استعمال ہوتا ہے: inline fun launch(block: suspend CoroutineScope.() -> Unit).
ہاں، ان لائن فنکشنز ڈیبگنگ کو پیچیدہ بناتے ہیں کیونکہ فنکشن کا جسم بلایا نہیں جاتا بلکہ کال مقام پر ان لائن کیا جاتا ہے۔ اسٹیک ٹریس لمبے ہو جاتے ہیں، بریک پوائنٹس کام کرتے ہیں لیکن غیر متوقع مقامات دکھا سکتے ہیں۔ JetBrains بغیر inline کے ڈیبگ کرنے اور صرف release بلڈز میں اسے فعال کرنے کی سفارش کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں