در kotlin امکانات و ویژگی های زیادی وجود داره که ما میتونیم از همه این امکانات برای نوشتن یک برنامه بهتر استفاده کنیم , در میان این همه lateinit و lazy از ویژگی های مهم مقدار دهی به متغییر ها هستن
ما باید این ویژگی ها رو بشناسیم و در موقعیت مناسب از انها استفاده کنیم.
اگر نمیخواهیم متغییری را در constructor آن مقدار دهی کنیم , در اینجا دو این دو ویژگی مهم به ما کمک مهمی برای مقدار دهی به متغییر میدهند.
به صورت خلاصه میشه گفت که lateinit is late initalization
در حالت عادی هنگامی که یک متغییر را تعریف میکنیم به صورت non-null یا non ناپذیر هستن باید در constructor مقدار دهی بشه , هر چند که ما توی برنامه هامون همیشه متغییر هامون به این صورت نیستن و متاسفانه این کار راحت نیست. به طور مثال متغییر ها میتونن با طزریق وابستگی مقدار دهی بشن!
یا اینکه بخواییم تابعی بنویسیسم تا کدمون رو تست کنه همون طور که مشخصه این مقادیر رو نمیشه داخل constructor مقدار دهی کرد و از طرف دیگه non-null هم رعایت بشه! دلیل اصلی این که باید رعایت بشه این هست که هر دفعه بخواییم از متغییرمون استفاده کنیم باید برسی کنیم که متغییرمون nullنباشه.
برای رسیدگی به این مورد میتونین متغییرتون رو با استفاده از lateinit تعریف کنین
public class Test { lateinit var mock: Mock @SetUp fun setup() { mock = Mock() } @Test fun test() { mock.do() } }
به صورت خلاصه میشه گفت که lazy is lazy initialization
کلمه کلیدی lazy در واقع یک تابع است که ورودی آن lamda هست که ما در آن شیوه مقدار دهی شدن متغییر رو تعریف میکنیم , در ادامه تابع lazy یک نمونه از lazy را برگشت میدهد مه به عنوان یک نماینده جهت مقدار دهی متغییر استفاده میشه.
برای اولین باری که get متغییر فراخوانی میشود این تابع فراخوانی شده و متغییر ما را در لحظه مورد استفاده مقدار دهی میکنه! و در بقیه موارد استفاده مقدار قبلی خود را حفط کرده و دوباره مقدار دهی نمیشه و همان مقدار اولیه که برای مقدار دهی استفاده شده را باز میگردونه.
public class Example{ val name: String by lazy { “mohsen aliakbari” } }
برای اولین باری که این تابع فراخوانی میشود و در ادامه فراخوانی این تابع مقدار بازگشتی آن همیشه برابر خواهد بود با "mohsen aliakbari".
حال بعد از آشنا شدن با این ویژگی های مهم بهتره مواد کاربرد اون رو دقیق بدونیم