آموزش زبان کاتلین – درس ۲۵ (Data Class)

نویسنده : سید ایوب کوکبی ۱۷ دی ۱۳۹۷

خیلی از مواقع لازم است کلاسی داشته باشیم که صرفاً داده‌هایی را نگه‌داری کند. کاتلین برای چنین شرایطی data class را معرفی کرده است. در واقع برای اینکه بتوانید یک کلاس داده ایجاد کنید کافی است کلمه data را قبل از آن بیاورید:

data class Person(val name: String, var age: Int)

برای این نوع کلاس‌ها، کامپایلر به صورت توابع زیر را ایجاد می‌کند:

  • توابع ()copy و ()equals و ()hashCode و ()toString به صورت خودکار پیاده‌سازی می‌شود؛
  • تابع ()componentN نیز ساخته می‌شود.

قبل از بررسی دقیق‌تر، ابتدا شرایط لازم برای ساخت کلاس‌های داده را در کاتلین معرفی کنم:

  • سازنده اولیه حداقل باید یک پارامتر داشته باشد؛
  • پارامترهای سازنده اولیه باید با علامت val (فقط خواندنی) یا var (خواندنی/نوشتنی) علامت بخورند؛
  • کلاس‌های داده نمی‌تواند open, abstract, inner یا sealed باشند؛
  • کلاس‌های داده می‌توانند سایر کلاس‌ها یا اینترفیس‌ها را پیاده‌سازی کنند. اگر از کاتلین نسخه قبل از ۱٫۱ استفاده می‌کنید، تنها امکان پیاده‌سازی اینترفیس وجود دارد.

مثال از Data Class در کاتلین

data class User(val name: String, val age: Int)

fun main(args: Array<String>) {
    val jack = User("jack", 29)
    println("name = ${jack.name}")
    println("age = ${jack.age}")
}

خروجی:

name = jack
age = 29

هنگام تعریف کلاس داده، کامپایلر به صورت خودکار چندین تابع تحت عنوان ()toString(), equals(), hashcode درست می‌کند. این توابع در کلاس دیده نمی‌شوند ولی وجود دارند. این کار باعث خوانایی کد نیز می‌شود. اگر تا الان از جاوا استفاده کرده باشید، چنین کاری مستلزم کدنویسی اضافه است. بیایید نگاهی به هر یک از توابع فوق و کاربردشان بیندازیم:

Copying

با کمک تابع ()copy به راحتی می‌توانید کپی برابر اصلی از یک شی ایجاد کنید:

data class User(val name: String, val age: Int)

fun main(args: Array<String>) {
    val u1 = User("John", 29)
   
    // using copy function to create an object
    val u2 = u1.copy(name = "Randy")

    println("u1: name = ${u1.name}, name = ${u1.age}")
    println("u2: name = ${u2.name}, name = ${u2.age}")
}

خروجی:

u1: name = John, name = 29
u2: name = Randy, name = 29

متد ()toString

این متد، یک فرم متنی از شی را به کاربر نشان می‌دهد:

data class User(val name: String, val age: Int)

fun main(args: Array<String>) {
    val u1 = User("John", 29)
    println(u1.toString())
}

خروجی:

User(name=John, age=29)

()equals و ()hashCode

متد ()hashCode کد هش یک object را برمی‌گرداند. اگر دو آبجکت از هر حیث یکسان باشند، این متد مقدار عددی یکسانی را برمی‌‌گرداند. متد ()equals اگر دو شی یکسان باشند (یعنی اگر ()hashCode یکسانی داشته باشند) مقدار true و در غیراینصورت مقدار false را برمی‌گرداند.

data class User(val name: String, val age: Int)

fun main(args: Array<String>) {
    val u1 = User("John", 29)
    val u2 = u1.copy()
    val u3 = u1.copy(name = "Amanda")

    println("u1 hashcode = ${u1.hashCode()}")
    println("u2 hashcode = ${u2.hashCode()}")
    println("u3 hashcode = ${u3.hashCode()}")

    if (u1.equals(u2) == true)
        println("u1 is equal to u2.")
    else
        println("u1 is not equal to u2.")

    if (u1.equals(u3) == true)
        println("u1 is equal to u3.")
    else
        println("u1 is not equal to u3.")
}

خروجی:

u1 hashcode = 71750738
u2 hashcode = 71750738
u3 hashcode = 771732263
u1 is equal to u2.
u1 is not equal to u3.

در کاتلین می‌توانید یک object را به مجموعه‌ای از متغیرها تقسیم کنید. برای مثال:

data class User(val name: String, val age: Int, val gender: String)

fun main(args: Array<String>) {
    val u1 = User("John", 29, "Male")

    val (name, age, gender) = u1
    println("name = $name")
    println("age = $age")
    println("gender = $gender")
}

خروجی:

name = John
age = 29
gender = Male

این کار امکان‌پذیر است چون کامپایلر به صورت خودکار توابع ()componentN را برای همه پراپرتی‌های کلاس‌های داده ایجاد می‌کند. برای مثال:

data class User(val name: String, val age: Int, val gender: String)

fun main(args: Array<String>) {
    val u1 = User("John", 29, "Male")

    println(u1.component1())     // John
    println(u1.component2())     // 29  
    println(u1.component3())     // "Male"
}

خروجی:

John
۲۹
Male
بخوانید  آموزش زبان کاتلین – درس 8 (شرط IF)

سید ایوب کوکبی

نویسنده و مترجم...

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *