data class Kotlin میں ایک خاص قسم کی کلاس ہے جو خصوصی طور پر ڈیٹا ذخیرہ کرنے کے لیے ڈیزائن کی گئی ہے۔ کمپائلر پرائمری کنسٹرکٹر میں متعین کردہ خصوصیات کی بنیاد پر خود بخود equals، hashCode، toString، copy اور componentN طریقے تیار کرتا ہے۔ JetBrains دستاویزات (2026) کے مطابق، data class Java کے مساوی کے مقابلے میں بوائلرپلیٹ کوڈ کی مقدار کو 50–70% تک کم کرنے کی اجازت دیتا ہے اور Kotlin پروجیکٹس میں قدری اشیاء کی بنیاد ہے۔
اہم نکات
data class Kotlin کا ایک نحوی تعمیر ہے جو خود بخود ان کلاسز کے لیے معیاری طریقے تیار کرتا ہے جن کا بنیادی مقصد ڈیٹا ذخیرہ کرنا ہے۔ data class کا اعلان کرتے وقت، کمپائلر پرائمری کنسٹرکٹر کی تمام خصوصیات کی بنیاد پر equals، hashCode، toString، copy اور componentN کے نفاذات تخلیق کرتا ہے۔
Java میں عام کلاسز کے برعکس، جہاں ڈویلپر کو IDE یا Lombok جیسی لائبریریوں کا استعمال کرتے ہوئے دستی طور پر getter، setter، equals، hashCode اور toString لکھنا پڑتا ہے، Kotlin ایک بلٹ ان میکانزم فراہم کرتا ہے۔ یہ نہ صرف کوڈ کو کم کرتا ہے بلکہ مستقل مزاجی بھی یقینی بناتا ہے — خودکار طریقے ہمیشہ موجودہ خصوصیت کی ساخت کے مطابق ہوتے ہیں۔
JetBrains Kotlin سروے (2025) کے مطابق، data class 78% Kotlin پروجیکٹس میں استعمال ہوتا ہے، جو اسے زبان کی سب سے زیادہ مانگی جانے والی خصوصیات میں سے ایک بناتا ہے۔ یہ خاص طور پر DTO، API ردعمل کے ماڈلز اور MVVM میں حالت کی اشیاء والے فن تعمیرات میں مقبول ہے۔
data class کو class سے پہلے data کلیدی لفظ کے ساتھ اعلان کیا جاتا ہے۔ خودکار طریقوں میں حصہ لینے والی تمام خصوصیات پرائمری کنسٹرکٹر میں متعین کی جاتی ہیں۔
data class User(
val id: Int,
val name: String,
val email: String
)
کوڈ کی ایک لائن Java میں درجنوں بوائلرپلیٹ لائنوں کی جگہ لے لیتی ہے۔ کمپائلر تینوں خصوصیات کے لیے equals، hashCode، toString، copy اور component1–component3 تیار کرتا ہے۔
خودکار طریقوں میں صرف پرائمری کنسٹرکٹر کی خصوصیات شامل ہوتی ہیں۔ اگر کلاس کے جسم میں کوئی خصوصیت اعلان کی جاتی ہے، تو وہ equals، hashCode، toString اور copy میں حصہ نہیں لیتی۔
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice is NOT included in equals/hashCode/copy
}
data class کے پرائمری کنسٹرکٹر میں کم از کم ایک پیرامیٹر ہونا چاہیے۔ تمام پیرامیٹرز کو val یا var کے طور پر نشان زد کیا جانا چاہیے۔ data class کے لیے open، abstract، sealed یا inner موڈیفائر استعمال نہیں کیے جا سکتے۔
equals اور hashCode پرائمری کنسٹرکٹر کی تمام خصوصیات کی قدروں کی بنیاد پر تیار ہوتے ہیں۔ data class کی دو مثالیں برابر سمجھی جاتی ہیں اگر ان کی تمام مطابقت پذیر خصوصیات برابر ہوں۔
Java میں، ڈیفالٹ آبجیکٹ موازنہ حوالہ جاتی موازنہ (==) ہے۔ قدری موازنہ کے لیے equals کو اوور رائڈ کرنے کی ضرورت ہے۔ Kotlin data class خود بخود یہ کرتا ہے، ساختی موازنہ کے لیے == کے استعمال کی اجازت دیتا ہے۔
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // true
toString طریقہ تمام خصوصیات کے ناموں اور قدروں کے ساتھ آبجیکٹ کی ایک پڑھنے کے قابل نمائندگی لوٹاتا ہے۔ یہ Java کے مقابلے میں لاگنگ اور ڈیبگنگ کو نمایاں طور پر آسان بناتا ہے، جہاں ڈیفالٹ آؤٹ پٹ ہیکساڈیسیمل فارمیٹ میں ہیش کوڈ دکھاتا ہے۔
Kotlin دستاویزات (2026) کے مطابق، data class کے toString کا فارمیٹ “User(id=1, name=John, email=john@example.com)” ہے۔ پرائمری کنسٹرکٹر سے خصوصیات ہٹاتے وقت، toString خود بخود اپ ڈیٹ ہو جاتا ہے — ڈی سنکرونائزیشن کا خطرہ ختم ہو جاتا ہے۔
copy data class کی اہم خصوصیات میں سے ایک ہے۔ یہ مخصوص خصوصیات کی قدروں کو تبدیل کرنے کی صلاحیت کے ساتھ آبجیکٹ کی ایک سطحی کاپی تخلیق کرتا ہے۔
data class Order(
val id: Long,
val status: String,
val amount: Double
)
val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = "Confirmed"
copy فنکشنل اسٹائل اور ناقابل تغیر (immutability) والے فن تعمیرات میں ناگزیر ہے۔ موجودہ آبجیکٹ کو تبدیل کرنے کے بجائے، تبدیل شدہ فیلڈز کے ساتھ ایک نئی کاپی تخلیق کی جاتی ہے، جو کوڈ کو زیادہ پیش قیاسی اور ملٹی تھریڈڈ منظرناموں میں محفوظ بناتا ہے۔
data class خود بخود اعلان کی ترتیب میں ہر خصوصیت کے لیے component1، component2 وغیرہ فنکشن تیار کرتا ہے۔ یہ آبجیکٹ کو متغیرات میں تحلیل کرنے کی اجازت دیتا ہے۔
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)") // "1: Alice (alice@example.com)"
تحلیل لیمبڈا اور for-each لوپس میں بھی کام کرتا ہے، جو data class کو مجموعات کے ساتھ کام کرنے کے لیے آسان بناتا ہے۔
پہلی حد — data class کسی دوسرے data class سے وراثت کی حمایت نہیں کرتا۔ صرف عام کلاسز یا انٹرفیس سے وراثت حاصل کی جا سکتی ہے۔
دوسری — خودکار طریقوں میں صرف پرائمری کنسٹرکٹر کی خصوصیات شامل ہوتی ہیں۔ کلاس کے جسم کی خصوصیات کو نظر انداز کیا جاتا ہے، جو اگر آپ اسے بھول جائیں تو غلط equals کا سبب بن سکتا ہے۔
تیسری — data class open، abstract، sealed یا inner نہیں ہو سکتا۔ یہ ہمیشہ final ہوتا ہے۔
چوتھی — data class کے اندر مجموعات کے لیے، copy سطحی کاپی کرتا ہے۔ کاپی شدہ مجموعہ کے اندر عناصر کو تبدیل کرنا اصل کو متاثر کرے گا۔
Kotlin بہترین طریقوں (2026) کے مطابق، data class DTO، API ماڈلز، قدری اشیاء اور حالت کی اشیاء کے لیے بہترین ہے۔ کاروباری منطق والے اجزاء کے لیے عام کلاسز استعمال کرنے کی سفارش کی جاتی ہے۔
اکثر پوچھے گئے سوالات
نہیں، data class کسی دوسرے data class سے وراثت حاصل نہیں کر سکتا۔ تاہم، یہ کسی عام کلاس سے وراثت حاصل کر سکتا ہے یا انٹرفیس کو نافذ کر سکتا ہے۔
کم از کم ایک خصوصیت۔ زیادہ سے زیادہ تعداد محدود نہیں ہے، لیکن تحلیل کے لیے componentN تیار ہوتا ہے۔
نہیں، خودکار طریقے صرف پرائمری کنسٹرکٹر کی خصوصیات پر غور کرتے ہیں۔ کلاس کے جسم کی خصوصیات equals، hashCode، toString اور copy میں حصہ نہیں لیتیں۔
ہاں، آپ data class کے جسم میں equals، hashCode یا toString کو اوور رائڈ کر سکتے ہیں۔ اس صورت میں، کمپائلر اپنا نفاذ تیار نہیں کرتا۔
data class خود بخود equals، hashCode، toString، copy اور componentN تیار کرتا ہے۔ عام کلاس دستی نفاذ کے بغیر یہ طریقے فراہم نہیں کرتی۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں