دیتا کلاس ها در کاتلین

دیتا کلاس ها در کاتلین

توضیحات و کاربردها

دیتا کلاس (Data Class) ها توسط کاتلین به صورت نیتیو پشتیبانی میشن و برای ذخیره و استفاده از داده ها طی زمان اجرای برنامه مورد استفاده قرار میگیرن.

یکی از نیاز های برنامه، ذخیره ی داده ها و استفاده از آنها طی زمان اجرای برنامه است.

وقتی داده ها رو از پایگاه داده میگیریم باید محلی برای ذخیره‌سازی و نگهداری اونا داشته باشیم یا برعکس وقتی بخوایم داده ای رو در پایگاه داده ‌ذخیره کنیم باید از جایی اونا رو بگیریم و به صورت تکی ‌ذخیره کنیم.

معمولا برای این کار برنامه نویس ها کلاس طراحی میکنن که این کلاس ها وظیفه ی نگهداری داده ها رو به عهده داره؛ کاتلین اومده این موضوع کاربردی رو به صورت نیتیو پیاده‌سازی کرده.

اگه بخوایم صحبت از طراحی کلاس معمولی برای ذخیره ی داده ها کنیم؛ این امر کاملا ممکنه اما کاتلین با نیتیو کردن کلاس های دیتا سعی در بهینه کردن برنامه و سریع تر شدن سرعت کد نویسی رو داشته.

یکی از کاربرد های مهم دیتا کلاس ها ایفا کردن نقش مدل در طراحی الگو است؛ در طراحی الگو های MVC، MVP، MVVM و ... از این کلاس ها به عنوان کلاس مدل میتونیم استفاده کنیم.

فرم کلی دیتا کلاس ها به صورت زیر است:

data class ClassName(val t0: T0, val t1: T1, ... , val tn: Tn){ ... }

توجه

هنگامی که از نقش کلاس های داده برای ذخیره ی اطلاعات صحبت می کنیم منظور طی زمان اجرای برنامه و بر روی حافظه ی موقت یعنی RAM است و تا زمانی که برنامه در حال اجراست این کلاس ها داده ها رو در خودشون میتونن نگه دارن و بعد از بسته شدن برنامه از بین میرن.

بررسی ویژگی ها

همینطور که گفتیم کاتلین به صورت نیتیو برای ذخیره، نگهداری و استفاده از داده ها در زمان اجرای برنامه از دیتا کلاس پشتیبانی می کنه.

در ادامه به بررسی ویژگی های این کلاس ها می پردازیم.

لزوم تعریف حداقل یک پراپرتی در کانستراکتور اولیه

هنگام تعریف دیتا کلاس تمام پارامتر های کانستراکتور اولیه باید به صورت پراپرتی تعریف بشن و حداقل باید یک پراپرتی در کانستراکتور اولیه تعریف کنیم.

data class Contact(val name: String){ ... }

تابع equals در دیتا کلاس

اگر تمام پراپرتی های کانستراکتور اولیه دو دیتا کلاس باهم برابر باشن دو کلاس باهم برابرند:

fun main(){ val c0 = Contact("Fredrick" , 332144141) var c1 = Contact("Fredrick", 332144141) val c2 = Contact("Fredrick", 442321345) println("Are c0 and c1 equals? ${c0 == c1)") println("Are c0 and c2 equals? ${c2 == c0}") println("What about c1 and c0? ${c1 == c0}") } data class Contact(val name: String, val phone: Long)

تابع hashCode

تابع hashCode در دیتا کلاس ها نیز تحت تاثیر پراپرتی های تعریف شده در کانستراکتور اولیه قرار داره

تابع toString

در دیتا کلاس ها toString به طور پیشفرض به فرم ClassName(t0=value0, t1=value1,..., tn=valueN) نمایش داده میشه؛ ClassName اسم کلاس و t0-tN اسم پراپرتی های تعریف شده در کانستراکتور اولیه هستند.

تابع copy

با تابع کپی میتونیم یک نمونه از دیتا کلاس رو به طور کامل یا در صورت نیاز با تغییر در بعضی از پراپرتی هاش به یک متغیر جدید کپی کنیم:

fun main(){ val c0 = Contact("Fredrick" , 332144141) val c1 = c0.copy() var c2 = c0.copy(name = "Joe", phone = 13214521) println(c0) println(c1) println(c2) } data class Contact(val name: String, val phone: Long){ //پراپرتی تعریف شده در بدنه ی کلاس val id = (1..INT.MAX_VALUE).random() }

پراپرتی های تعریف شده در بدنه ی کلاس تاثیری در ویژگی یا عملکرد توابع بالا ندارن.

توجه

دیتا کلاس ها نمیتونن با abstract ، open ، sealed یا inner تعریف بشن!

خلاصه

دیتا کلاس ها توسط کاتلین برای کوتاه تر، سریع تر و بهینه تر کردن کد های برنامه معرفی شدن.

هنگام تعریف دیتا کلاس ها حداقل باید یک پراپرتی در کانستراکتور اولیه تعریف کنیم.

توابع toString ، hashCode و copy در دیتا کلاس ها تحت تاثیر مستقیم پراپرتی های تعریف شده در کانستراکتور اولیه ی کلاس هستند.

با استفاده از تابع copy در دیتا کلاس ها میتونیم یک نمونه ی جدید از کلاسمون ایجاد کنیم و در صورت نیاز مقادیر بعضی از پراپرتی های تعریف شده در کانستراکتور اولیه رو تغییر بدیم.

arrow_drop_up
کپی شد!