اگر نیاز به آشنایی اولیه با کاتلین و نحوه تعریف نوعها در اون رو دارید توصیه میکنم اول این مقاله رو بخونید. لازم هست قبل از خواندن با چند اصطلاح آشنا بشیم:
mutable : تغییر پذیر
immutable : تغییر ناپذیر
ا NullSafety یکی از بهترین ویژگی های کاتلین هست. این ویژگی باعـث میشه که شما در سطح زبان برنامه نویسی به تهی پذیری (nullability) فکر کنید در نتیجه میتونید از بسیاری NullPointerException
های مخفی که در جاوا معموله، خلاص بشید. وقتی از ابزارهای اتوماتیک برای تبدیل کد جاوا به کاتلین استفاده میکنید کلی !!
(بخوانید دو علامت تعجب) میبینید. تا حد ممکن باید تعداد اونها رو کم کرد دلیلش اینه که !!
به این معنی هست که "در این نقطه پتانسیل وجود KotlinNullPointerException
هندل نشده وجود داره".
کاتلین مکانیزم های هوشمندانه ای برای رفع این مشکل داره، شاید با یکی یا چندتا از اونها آشنا باشید. ما اینجا 6 راه برای حل این مشکل معرفی میکنیم.
1- استفاده از val به جای var
کاتلین باعث میشه شما در سطح زبان به immutability فکر کنید و این خیلی عالیه. val
فقط خواندنی و var
(متغیر variable) قابل تغییر هست. توصیه میشه تا حد ممکن متغیرهاتون رو فقط خواندنی تعریف کنید. چون Thread safe هست و با برنامه نویسی تابعی هماهنگه. اگه متغیرهای val
رو به صورت immutable به کار ببریم لازم نیست دیگه نگران تهی پذیری باشیم. در نظر داشته باشید val
میتونه mutable هم باشه(اگر برای متغیرتون getter
ننوشتید متغیرتون immutable هست و لازم نیست نگران چیزی باشید).
2- استفاده از lateinit
گاهی شما نمیتونید از متغیرهای immutable استفاده کنید. برای مثال در اندروید متغیری رو در نظر بگیرید که در onCreate
مقداردهی میشه. برای این مورد kotlin کلمه کلیدی lateinit
رو داره.
شما میتونید این کد رو:
به این تغییر بدید
در نظر داشته باشید اگه متغیر lateinit
رو قبل از مقدار دهی استفاده کنید باعث خطا از نوع UninitializedPropertyAccessException
میشه.
متاسفانه نمیتوان متغیر lateinit
از انواع داده primitive(مثل Int
) تعریف کرد. برای این نوع دادهها میتونید از Delegates
استفاده کنید:
private var mNumber: Int by Delegates.notNull<Int>()
3. استفاده از lazy
با استفاده از by lazy
میتونید متغیرهای immutable و تهی ناپذیر تعریف کنید، که در زمان مناسب مقدار دهی بشوند.
مثال:
ا messageView
فقط در اولین استفاده، با اجرای بلاک کد lazy
مقداردهی میشه و در استفادههای بعدی همون مقدار مورد استفاده قرار میگیره.
این طوری ما میتونیم حتی متغیرهایی که در لحظه ایجاد شدن شی آماده مقداردهی نیستاند(مثل ویوها در اندروید) رو هم immutable تعریف کنیم.
4. استفاده از let
کد زیر نمونه معمولی از ارورهای زمان کامپایل تو کاتلین هست:
شاید همیشه براتون سوال شده باشه که چرا کامپایلر کاتلین اینجا نمیتونه Smart cast رو انجام بده. دلیلش اینه که ممکنه thread
دیگه ای غیر از thread
ی که null
بودن رو داره چک میکنه این متغیر رو null
کنه.
این مشکل آزار دهنده است. من این رو مطمئن ام که این متغیر نمیتونه بعد از چک برای null
نبودن تغییر کرده باشه. خیلی از برنامه نویسها این مشکل رو با !!
سریع حل میکنن:
اما راه حل بهتر برای این مشکل استفاده از متد let
هست:
اگه mPhotoUrl
نال باشه کد داخل let
اجرا نمیشه.
5. استفاده از Elvis operator
اگر ممکنه متغیر null
باشه و ی مقدار پیش فرض جایگزین برای موقع null
بودن در نظر گرفته اید Elvis operator خیلی به درد میخوره. ما میتونید این کد رو:
به این تغییر بدیم:
نتیجه اش اینه میشه که علاوه بر حل مشکل !!
کد کمتر و تمیزتری داریم.(کد کمتر اکثرا با کد بهتر مترادفه :) )
6. زیر پا گذاشتن مقررات
باز هم مواردی وجود داره که شما مطمئنید که متغیر با اینکه تهی پذیر هست نمیتونه null
باشه و اگر null
باشه ی باگی تو کدتون وجود داره که باید اصلاح بشه. با این حال !!
به شما چیزی جز ی Exception
بدون پیام که دیباگ کردنش مشکله نمیده. پس بهتره از متدهایی مثل requireNotNull
یا checkNotNull
به همراه پیغام خطای مناسب استفاده کنید که دیباگ کردن رو هم راحتتر میکنه.
تغییر این کد:
به این کد:
نتیجه گیری
اگر از 6 تکنیک بالا استفاده کنید میتوانید همه !!
ها رو از کدتون حذف کنید. وقتی با این کار کد شما مطمئنتر، تمیزتر و دیباگ آن راحتتر خواهد بود. اگر راههای دیگه ای برای حذف !!
میشناسید یا مشکلی در این مطلب هست تو کامنت ها بهم اطلاع بدید.