خواص (Properties)
property (خصوصیت) استانداردی در کاتلین برای دسترسی به فیلدهای داخل یک کلاس میباشد. هر property دارای دو بخش میباشد، یک بخش جهت مقدار دهی (بلوک set) و یک بخش برای دسترسی به مقدار فیلد (بلوک get) میباشد. در کاتلین، get و set اختیاری هستند و اگر شما آنها را در برنامه خود ایجاد نکنید، در پس زمینه به صورت خودکار ایجاد میشوند. به کد زیر توجه کنید :
class Person { var name: String = "" }
کد بالا با کد زیر برابر است:
class Person { var name: String = "" get() { return field } set(value) { field = value } }
ر مثال زیر نحوه تعریف و استفاده از property آمده است :
1: class Person 2: { 3: var name: String = "" 4: get() 5: { 6: return field 7: } 8: set(value) 9: { 10: field = value 11: } 12: 13: var age: Int = 0 14: get() 15: { 16: return field 17: } 18: set(value) 19: { 20: field = value 21: } 22: 23: var height: Double = 0.0 24: get() 25: { 26: return field 27: } 28: set(value) 29: { 30: field = value 31: } 32: } 33: 34: fun main(args: Array<String>) 35: { 36: val person1 = Person() 37: val person2 = Person() 38: 39: person1.name = "Frank" 40: person1.age = 19 41: person1.height = 162.0 42: 43: println("Name : ${person1.name}") 44: println("Age : ${person1.age} years old") 45: println("Height: ${person1.height}cm") 46: 47: println() //Separator 48: 49: person2.name = "Ronald" 50: person2.age = 25 51: person2.height = 174.0 52: 53: println("Name : ${person2.name}") 54: println("Age : ${person2.age} years old") 55: println("Height: ${person2.height}cm") 56: }
Name : Frank Age : 19 years old Height: 162.0cm Name : Ronald Age : 25 years old Height: 174.0cm
در برنامه بالا نحوه استفاده از property آمده است. همانطور که مشاهده میکنید در این برنامه ما سه فیلد تعریف کردهایم (خطوط 3 و 13 و 23). در زیر هر فیلد هم دو بلوک set و get قرار دادهایم.
برای اختصاص یک مقدار به فیلد کافیست که به صورت زیر عمل کنیم:
Object.filedName = Value;
ابتدا نامشی ایجاد شده از کلاس را نوشته، بعد علامت نقطه و نام فیلد و سپس مقداری را که میخواهیم به فیلد اختصاص دهیم بعد از علامت مساوی مینویسیم (کاری که در خطوط 41-39 و 51-49 انجام دادهایم). برای دریافت مقدار فیلد هم کافیست که نام شیء را نوشته و علامت نقطه و بعد نام فیلد را بعد از آن بنویسید (کاری که در خطوط 45-43 و 55-53 انجام دادهایم):
Object.filedName;
زمانی که شما یک شیء از کلاس Person ایجاد میکنید و name را که یک فیلد است را مقداردهی میکنید، مقداری که برای آن در نظر گرفتهاید، به عنوان پارامتر به بلوک set ارسال میشود و به جای value مینشیند، سپس مقدار value در داخل field قرار میگیرد. استفاده از property ها کد نویسی را انعطاف پذیر میکند مخصوصاً اگر بخواهید یک اعتبارسنجی برای اختصاص یک مقدار به فیلدها یا استخراج یک مقدار از آنها ایجاد کنید. مثلاً شما میتوانید یک محدودیت ایجاد کنید که فقط اعداد مثبت به فیلد age (سن) اختصاص داده شود. میتوانید با تغییر بخش set خاصیت Age این کار را انجام دهید :
var age: Int = 0 get() { return field } set(value) { if(value > 0 && value < 100) field = value else 0 }
در کد بالا، گفتهایم که اگر مقداری که قرار است به فیلد age اختصاص یابد عددی بین 0 تا 100 بود، این کار انجام شود در غیر اینصورت مقدار 0 به فیلد مورد نظر اختصاص یابد. حال اگر کاربر بخواهد یک مقدار منفی به فیلد age اختصاص دهد مقدار age صفر خواهد شد. همچنین میتوان یک property فقط خواندنی (read-only) ایجاد کرد. برای این کار کافیست که در هنگام تعریف فیلدها به جای کلمه var از val استفاده کنید. این property فاقد بخش set است. به عنوان مثال میتوان یک خاصیت Name فقط خواندنی مانند زیر ایجاد کرد :
class Person { val name: String = "Frank" }
در این مورد اگر بخواهید یک مقدار جدید به فیلد name اختصاص دهید با خطا مواجه میشوید.