کاتلین از ابتدا : extension properties

ه Extension Properties :

ه Extension properties یک روش برای extened کردن کلاس‌هایی هست که برای دسترسی به اونا به جای شیوه‌ی سینتکس‌گذاری توابع میشه از روش سینتکس‌گذاری propertyها استفاده کرد. درسته که بهشون میگیم extension properties ، ولی نمیتونن هیچ stateای رو توی خودشون نگه دارن، چون هیچ جایی برای نگه داشتن آبجکت‌های جاوایی توی خودشون، ندارن. این ویژگی نه تنها چیز بدی نیست بلکه خیلی هم خوبه و خیلی وقتا باعث کوتاه‌تر شدن کد ما میشه.

https://gist.github.com/sajjadyousefnia/fb50a8204ffe51adc0da94111823db27

اگه یادتون باشه توی قسمت در مورد extension functionها صحبت کردیم، خب حالا،‌ فرض کنید یک extension function ای به اسم lastChar. ( شبیه شکل بالا ) رو برای کلاس String تعریف کنیم. خب حالا همینو تبدیلش می‌کنیم به property :

https://gist.github.com/sajjadyousefnia/2fdd07564f68b58c66a3aeeb6b60919f

همونطور که میبینید، یک extension property ساختیم، اگه دقت کنید میبینید یک تابع عادی و یک receiver type داریم. به این دلیل که هیچ backing fieldای نداریم، همیشه getter باید از قبل تعریف شده باشه و به همین دلیل هم هست که getter رو نمیشه هیچ وقت implement یا پیاده‌سازی کرد. و در ضمن چون هیچ جایی برای نگه‌داشتن متغییری هم نداریم، نمیتونیم یک متغییری رو تعریف و مقداردهیش کنیم.

در صورتی که همون property رو با استفاده از یک StringBuilder تعریفش کنیم، چون مقدارش قابل تغییره، میتونیم از var استفاده کنیم.

https://gist.github.com/sajjadyousefnia/7c19f2487d177302845073103676826a

نحوه‌ی دسترسی به extension properties خیلی شبیه به member properties هست :

https://gist.github.com/sajjadyousefnia/55099304d857c059f3bb3c52fd593329

دقت کنید که وقتی میخواید از جاوا به extension property دسترسی پیدا کنید، بایستی از getter اون استفاده کنید، مثلا اینجوری بنویسید : StringUtilKt.getLastChar("Java")

یعنی از این فرمول باید استفاده بشه :

package name + Kt + get + extension function name + property

تقریبا شبیه وقتی هست که میخوایم extension functionها رو از جاوا فراخوانی کنیم.

خب صحبت از extensionها در اینجا به پایان میرسه و در ادامه در مورد higher-order functions صحبت خواهیم کرد.