مفهوم Delegation در کاتلین چیست
Delegation در کاتلین چیست ؟
1398-08-13
معرفی 8 افزونه کاربردی برای مرورگر گوگل کروم و فایرفاکس
معرفی 8 افزونه کاربردی برای مرورگر گوگل کروم و فایرفاکس
1398-08-18

آموزش lateinit در کاتلین ، lateinit در کاتلین چیست ؟ کلمه کلیدی lateinit برای مقدار دهی کمی دیرتر متغیر هاست.دقت کنید که گفتیم کمی دیرتر ! بدین معنی که حتما باید مقدار دهی شود و بصورت پیش فرض مقدار null دارد و درصورتی که مقدار دهی نشود باعث دردسر و خطای برنامه خواهد شد !

آموزش lateinit در کاتلین

کلمه کلیدی lateinit زمانی مفید خواهد بود که یک مقدار اجازه تعریف شدن با مقدار null را ندارد اما برنامه نویس مطمئن است زمان استفاده از این متغیر ، متغیر null نیست و حتما مقدار دارد اما با این حال چک کردن متغیر جهت null‌ نبودن الزامی ست !

موارد استفاده lateinit در کاتلین

در موارد زیر کلمه کلیدی lateinit بشدت کار آمد خواهد بود :

  • زمان استفاده در اندروید : متغیر هایی که در متدهای چرخه حیات یا lifecycle مقدار دهی میشوند
  • زمان استفاده در Dagger دگر برای DI (Dependency Injection) :‌ متغیرهای تزریق شده درون کلاس
  • خارج از کلاس مقداردهی می شوند و بطور مستقل درون سازنده ها یا constructor ها هستند.
  • کانفیگ unit test : متغیر های محیط تست‌ test در annotation یا حاشیه نوشت @Before درون متد مقدار دهی میشوند.

دستور lateinit همچنین در زبان swift برای iOS هم استفاده میشود اما به صورت : var book: Book!

پیش نیازهای استفاده از کلمه کلیدی lateinit

برای استفاده از دستور lateinit باید پیش نیاز های زیر را رعایت کنید:

  • متغیر باید با دستور var تعریف شود و نه val.
  • پراپرتی میتواند درون بدنه کلاس تعریف شود.
  • مقداردهی اولیه مجاز نیست.
  • متغیر تنها میتواند از انواع non-null باشد.

زمان استفاده از دستور lateinit در پس زمینه چه اتفاقی رخ میدهد؟

شاید فکر کنید دستور lateinit کار خارق العاده و عجیبی انجام میدهد اما درواقع چنین نیست ، بیایید نگاهی به دستور دیکامپایل شده lateinit بیاندازیم.دستور زیر را در کاتلین مینویسیم:

 lateinit var book: Book

و درواقع به دستور زیر ترجمه میشود:

 @NotNull
 public Book book;
@NotNull
 public final Book getBook() {
   Book var10000 = this.book;
   if(this.book == null) {
     Intrinsics.throwUninitializedPropertyAccessException("book");
   }
   return var10000;
 }
public final void setBook(@NotNull Book var1) {
   Intrinsics.checkParameterIsNotNull(var1, "");
   this.book = var1;
 }

اما اگر قبل از مقداردهی یک متغیر از نوع lateinit از آن استفاده کنیم چه اتفاقی رخ میدهد؟

در ابتدای پست گفته شد که حتما باید متغیر lateinit را مقداردهی کرد و حتی زمان استفاده شرطی جهت null نبودن ذکر کرد ، اما اگر ما از متغیر lateinit قبل از مقداردهی استفاده کنیم برای مثال از متغیر زیر قبل از مقداردهی اولیه استفاده کنیم:

 lateinit var book: Book

با خطای RunTimeException زیر مواجه میشویم:

kotlin.UninitializedPropertyAccessException: lateinit property book has not been initialized

اما خبر خوب
از کاتلین 1.2 به بالا میتوانیم با دستور .isInitialized متغیر تعریف شده با دستور lateinit را چک کنیم که آیا مقدار دهی شده یا خیر (برای جلوگیری از خطای RunTime )

امیدوارم این آموزش برای شما مفید بوده باشد.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *