data class در Kotlin — چیست، syntax و ویژگی‌های کلاس‌های داده

نویسنده: IT Sectr منتشر شده: 2026-06-20 زمان مطالعه: 10 دقیقه

data class در Kotlin یک نوع کلاس ویژه است که صرفاً برای ذخیره‌سازی داده‌ها طراحی شده است. کامپایلر به‌طور خودکار متدهای equals, hashCode, toString, copy و componentN را بر اساس ویژگی‌های مشخص‌شده در primary constructor تولید می‌کند. طبق مستندات JetBrains (2026)، data class حجم کدهای تکراری را در مقایسه با معادل‌های Java تا 50–70٪ کاهش می‌دهد و پایه‌ای برای value-اشیاء در پروژه‌های Kotlin است.

نکات اصلی

  • data — کلمه کلیدی برای اعلام کلاس داده در Kotlin
  • equals و hashCode — به‌طور خودکار بر اساس تمام ویژگی‌های primary constructor تولید می‌شوند
  • copy — تابع کپی سطحی با امکان جایگزینی فیلدهای جداگانه
  • componentN — تخریب data class به متغیرهای جداگانه
  • Primary constructor باید حداقل یک پارامتر val یا var داشته باشد

data class در 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 محبوب است.

Syntax و امکانات اصلی

data class با کلمه کلیدی data قبل از class اعلام می‌شود. تمام ویژگی‌هایی که در متدهای خودکار شرکت می‌کنند در primary constructor مشخص می‌شوند.

kotlin
data class User(
    val id: Int,
    val name: String,
    val email: String
)

یک خط کد جایگزین ده‌ها خط کد تکراری در Java می‌شود. کامپایلر equals, hashCode, toString, copy و component1–component3 را برای هر سه ویژگی تولید می‌کند.

ویژگی‌های خارج از primary constructor

متدهای خودکار فقط ویژگی‌های primary constructor را شامل می‌شوند. اگر ویژگی در بدنه کلاس اعلام شود، در equals, hashCode, toString و copy شرکت نمی‌کند.

kotlin
data class Product(
    val id: Int,
    val title: String
) {
    var cachedPrice: Double = 0.0
    // cachedPrice در equals/hashCode/copy گنجانده نشده است
}

محدودیت‌های primary constructor

Primary constructor data class باید حداقل یک پارامتر داشته باشد. تمام پارامترها باید با val یا var مشخص شوند. برای data class نمی‌توان از modifierهای open, abstract, sealed یا inner استفاده کرد.

متدهای خودکار equals, hashCode و toString

equals و hashCode بر اساس مقادیر تمام ویژگی‌های primary constructor تولید می‌شوند. دو نمونه data class اگر تمام ویژگی‌های متناظر آنها برابر باشد، برابر در نظر گرفته می‌شوند.

equals برای مقایسه مقداری

در Java مقایسه پیش‌فرض اشیاء مقایسه مرجع است (==). برای مقایسه بر اساس مقدار نیاز به override کردن equals است. Kotlin data class این کار را به‌طور خودکار انجام می‌دهد و امکان استفاده از == را برای مقایسه ساختاری فراهم می‌کند.

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // درست

toString برای اشکال‌زدایی

متد toString نمایش قابل خواندن از شیء را با نام و مقادیر تمام ویژگی‌ها برمی‌گرداند. این کار ثبت وقایع و اشکال‌زدایی را در مقایسه با Java که به‌طور پیش‌فرض hash-کد را در قالب هگزادسیمال نمایش می‌دهد، به‌طور قابل توجهی ساده‌تر می‌کند.

طبق Kotlin Documentation (2026)، فرمت toString data class به این صورت است: “User(id=1, name=John, email=john@example.com)”. هنگام حذف ویژگی‌ها از primary constructor، toString به‌طور خودکار به‌روز می‌شود — خطر عدم همگام‌سازی وجود ندارد.

تابع copy و تخریب

copy — یکی از امکانات کلیدی data class است. یک کپی سطحی از شیء با امکان تغییر مقادیر ویژگی‌های مشخص‌شده ایجاد می‌کند.

kotlin
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) ضروری است. به جای تغییر شیء موجود، یک کپی جدید با فیلدهای تغییر یافته ایجاد می‌شود که کد را قابل پیش‌بینی‌تر و در سناریوهای چندنخی ایمن‌تر می‌کند.

تخریب از طریق componentN

data class به‌طور خودکار توابع component1, component2 و غیره را برای هر ویژگی به ترتیب اعلام آنها تولید می‌کند. این امکان تخریب شیء به متغیرها را فراهم می‌کند.

kotlin
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 دیگر ارث‌بری کند؟

خیر، data class نمی‌تواند از data class دیگر ارث‌بری کند. با این حال می‌تواند از یک کلاس معمولی ارث‌بری کند یا اینترفیس‌ها را پیاده‌سازی کند.

چه تعداد ویژگی باید در primary constructor باشد؟

حداقل یک ویژگی. حداکثر تعداد محدود نیست، اما برای تخریب تا componentN تولید می‌شود.

آیا ویژگی‌های بدنه کلاس در equals شرکت می‌کنند؟

خیر، متدهای خودکار فقط ویژگی‌های primary constructor را در نظر می‌گیرند. ویژگی‌های بدنه کلاس در equals, hashCode, toString و copy شرکت نمی‌کنند.

آیا می‌توان متدهای خودکار را به‌صورت دستی override کرد؟

بله، شما می‌توانید equals, hashCode یا toString را در بدنه data class override کنید. در این حالت کامپایلر پیاده‌سازی خود را تولید نمی‌کند.

تفاوت data class با کلاس معمولی چیست؟

data class به‌طور خودکار equals, hashCode, toString, copy و componentN را تولید می‌کند. کلاس معمولی بدون پیاده‌سازی دستی این متدها را ارائه نمی‌دهد.

خلاصه

  • data class — ساختار نحوی Kotlin برای ذخیره داده‌ها با تولید خودکار متدها
  • equals و hashCode — مقایسه ساختاری بر اساس ویژگی‌های primary constructor
  • toString — نمایش قابل خواندن شیء برای اشکال‌زدایی و ثبت وقایع
  • copy — کپی سطحی با جایگزینی فیلدهای جداگانه با آرگومان‌های نام‌گذاری شده
  • componentN — تخریب اشیاء به متغیرها برای کار راحت با مجموعه‌ها
  • محدودیت‌ها — پیش‌فرض final, حداقل یک ویژگی, عدم ارث‌بری data->data
  • کاربرد — DTO, مدل‌های API, value objects, state در MVVM

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید