data class در Kotlin یک نوع کلاس ویژه است که صرفاً برای ذخیرهسازی دادهها طراحی شده است. کامپایلر بهطور خودکار متدهای equals, hashCode, toString, copy و componentN را بر اساس ویژگیهای مشخصشده در primary constructor تولید میکند. طبق مستندات JetBrains (2026)، data class حجم کدهای تکراری را در مقایسه با معادلهای Java تا 50–70٪ کاهش میدهد و پایهای برای value-اشیاء در پروژههای Kotlin است.
نکات اصلی
data class یک ساختار نحوی Kotlin است که بهطور خودکار متدهای استاندارد را برای کلاسهایی تولید میکند که هدف اصلی آنها ذخیرهسازی دادههاست. هنگام اعلام data class، کامپایلر پیادهسازیهای equals, hashCode, toString, copy و componentN را بر اساس تمام ویژگیهای primary constructor ایجاد میکند.
بر خلاف کلاسهای معمولی در Java، که برنامهنویس باید بهصورت دستی getterها، setterها، equals, hashCode و toString را با استفاده از IDE یا کتابخانههایی مانند Lombok بنویسد، Kotlin یک مکانیزم داخلی ارائه میدهد. این نه تنها کد را کوتاهتر میکند، بلکه سازگاری را تضمین میکند — متدهای خودکار همیشه با ساختار فعلی ویژگیها مطابقت دارند.
طبق دادههای JetBrains Kotlin Survey (2025)، data class در 78٪ پروژههای Kotlin استفاده میشود که آن را به یکی از پرتقاضاترین امکانات زبان تبدیل کرده است. این کلاس بهویژه در معماریهای دارای DTO، مدلهای پاسخ API و state-اشیاء در MVVM محبوب است.
data class با کلمه کلیدی data قبل از class اعلام میشود. تمام ویژگیهایی که در متدهای خودکار شرکت میکنند در primary constructor مشخص میشوند.
data class User(
val id: Int,
val name: String,
val email: String
)
یک خط کد جایگزین دهها خط کد تکراری در Java میشود. کامپایلر equals, hashCode, toString, copy و component1–component3 را برای هر سه ویژگی تولید میکند.
متدهای خودکار فقط ویژگیهای primary constructor را شامل میشوند. اگر ویژگی در بدنه کلاس اعلام شود، در equals, hashCode, toString و copy شرکت نمیکند.
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice در equals/hashCode/copy گنجانده نشده است
}
Primary constructor data class باید حداقل یک پارامتر داشته باشد. تمام پارامترها باید با val یا var مشخص شوند. برای data class نمیتوان از modifierهای open, abstract, sealed یا inner استفاده کرد.
equals و hashCode بر اساس مقادیر تمام ویژگیهای primary constructor تولید میشوند. دو نمونه data class اگر تمام ویژگیهای متناظر آنها برابر باشد، برابر در نظر گرفته میشوند.
در Java مقایسه پیشفرض اشیاء مقایسه مرجع است (==). برای مقایسه بر اساس مقدار نیاز به override کردن 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) // درست
متد toString نمایش قابل خواندن از شیء را با نام و مقادیر تمام ویژگیها برمیگرداند. این کار ثبت وقایع و اشکالزدایی را در مقایسه با Java که بهطور پیشفرض hash-کد را در قالب هگزادسیمال نمایش میدهد، بهطور قابل توجهی سادهتر میکند.
طبق Kotlin Documentation (2026)، فرمت toString data class به این صورت است: “User(id=1, name=John, email=john@example.com)”. هنگام حذف ویژگیها از primary constructor، 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 دیگر ارثبری کند. فقط میتوان از کلاسهای معمولی یا اینترفیسها ارثبری کرد.
دومین — متدهای خودکار فقط ویژگیهای primary constructor را شامل میشوند. ویژگیهای بدنه کلاس نادیده گرفته میشوند که میتواند منجر به equals نادرست شود اگر این را فراموش کنید.
سومین — data class نمیتواند open, abstract, sealed یا inner باشد. همیشه final است.
چهارمین — برای مجموعههای داخل data class، کپی سطحی انجام میدهد. تغییر عناصر درون مجموعه کپیشده بر روی اصلی تأثیر میگذارد.
طبق Kotlin Best Practices (2026)، data class برای DTO، مدلهای API، value objects و state-اشیاء بهینه است. برای کامپوننتهای دارای منطق تجاری، استفاده از کلاسهای معمولی توصیه میشود.
سوالات متداول
خیر، data class نمیتواند از data class دیگر ارثبری کند. با این حال میتواند از یک کلاس معمولی ارثبری کند یا اینترفیسها را پیادهسازی کند.
حداقل یک ویژگی. حداکثر تعداد محدود نیست، اما برای تخریب تا componentN تولید میشود.
خیر، متدهای خودکار فقط ویژگیهای primary constructor را در نظر میگیرند. ویژگیهای بدنه کلاس در equals, hashCode, toString و copy شرکت نمیکنند.
بله، شما میتوانید equals, hashCode یا toString را در بدنه data class override کنید. در این حالت کامپایلر پیادهسازی خود را تولید نمیکند.
data class بهطور خودکار equals, hashCode, toString, copy و componentN را تولید میکند. کلاس معمولی بدون پیادهسازی دستی این متدها را ارائه نمیدهد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.