کلاس دادهای مانند یک struct در سایر زبان هاست - فقط برای این وجود دارد که چند داده نگهداری کند - اما یک شیِکلاسدادهای همچنان یک شی است. شیهای کلاس دادهای کاتلین فواید دیگری هم دارند، مانند ابزارهایی برای چاپ و کپی کردن. در این تکلیف شما یک کلاس دادهای ساده می سازید و درباره پشتیبانی کاتلین از کلاس های داده ای میآموزید.
گام ۱: یک کلاس داده ای بسازید
۱. یک بسته جدید به نام decor زیر بسته example.myapp برای نگه داشتن کد جدید بسازید. روی example.myapp در پنل Project راست کلیک کنید و مسیر File > New > Package را انتخاب کنید.
۲. داخل بسته یک کلاس جدید به نام Decoration بسازید.
package example.myapp.decor class Decoration { }
۳. برای ساختن یک کلاس داده ای از Decoration کلمه کلیدی data را پیشوند کلاس قرار دهید.
۴. برای ارائه دادنِ داده به کلاس یک خصوصیت رشتهای به نام rocks به آن اضافه کنید.
data class Decoration(val rocks: String) { }
۵. داخل فایل، خارج از کلاس یک تابع ()makeDecorations برای ساختن و چاپ کردن یک نمونه از Decoration با "granite" اضافه کنید.
fun makeDecorations() { val decoration1 = Decoration("granite") println(decoration1) }
۵. یک تابع ()main برای صدا زدن ()makeDecorations و اجرا کردن برنامه اضافه کنید. به خروجی مخصوصی که توسط کلاس دادهای ساخته شده توجه کنید.
⇒ Decoration(rocks=granite)
۶. داخل ()makeDecorations، دو شی Decoration دیگر که هر دو تخته سنگ (slate) هستند معرفی کنید و آنها را چاپ کنید.
fun makeDecorations() { val decoration1 = Decoration("granite") println(decoration1) val decoration2 = Decoration("slate") println(decoration2) val decoration3 = Decoration("slate") println(decoration3) }
۷. داخل ()makeDecorations، یک عبارت چاپ برای چاپ کردن نتیجه مقایسه decoration1 با decoration2 و یک عبارت دیگر برای مقایسه decoration3 با decoration2 اضافه کنید. از متد ()equals که توسط کلاسهای داده ای ارائه شده است استفاده کنید.
println (decoration1.equals(decoration2)) println (decoration3.equals(decoration2))
۸. کد را اجرا کنید.
⇒ Decoration(rocks=granite) Decoration(rocks=slate) Decoration(rocks=slate) false true
شما می توانستید از == برای امتحان کردن مساوی بودن d1 == d2 و d3 == d2 استفاده کنید. در کاتلین استفاده از == روی شیهای کلاسدادهای مانند استفاده از ()equals است. اگر نیاز دارید تا مراجعه دو متغیر به یک شی را امتحان کنید (برابری ارجاع) از عملگر === استفاده کنید. درباره مساوی بودن در کاتلین داخل مستندات بیشتر بخوانید.
با اینکه آنها مانند استراکت در زبانهای دیگر هستند به یاد داشته باشید که کلاس دادهای شی هستند. اختصاص دادن یک شی کلاس دادهای به یک متغیر دیگر ارجاع به آن شی را کپی می کند، نه محتوای آن را. برای کپی کردن محتوای کلاس دادهای به یک شی جدید از متد ()copy استفاده کنید.
متد ()copy و ()equals، و ابزارهای دیگر کلاس دادهای فقط به خصوصیات تعریف شده در سازنده اصلی رجوع میکنند.
گام ۲: استفاده از تخریب ساختار (destructuring)
برای گرفتن خصوصیات یک شی داده و اختصاص دادن آنها به متغیرها، شما می توانستید آنها را یکباره اختصاص دهید، مثل این:
val rock = decoration.rock val wood = decoration.wood val diver = decoration.diver
به جای این، شما می توانید متغیر بسازید، یکی برای هر خصوصیت، و شیء داده را به گروهی از متغیرها اختصاص دهید. کاتلین مقدار خصوصیت را داخل هر متغیر قرار می دهد.
val (rock, wood, diver) = decoration
به این تخریب ساختار (destructuring) گفته میشود که یک راه کوتاه کاربردی است. تعداد متغیر ها باید با تعداد خصوصیات همخوانی داشته باشد، و متغیر ها به ترتیبی که داخل کلاس تعریف شدهاند اختصاص مییابند. این یک مثال کامل است که میتوانید در Decoration.kt امتحان کنید.
// Here is a data class with 3 properties. data class Decoration2(val rocks: String, val wood: String, val diver: String){ } fun makeDecorations() { val d5 = Decoration2("crystal", "wood", "diver") println(d5) // Assign all properties to variables. val (rock, wood, diver) = d5 println(rock) println(wood) println(diver) }
⇒ Decoration2(rocks=crystal, wood=wood, diver=diver) crystal wood diver
اگر به تعدادی از خصوصیات نیاز ندارید، می توانید با استفاده از _ به جای نام متغیر از آنها گذر کنید، مانند کدی که در پایین نشان داده شده است.
val (rock, _, diver) = d5