محمد صادق مهرافزون
محمد صادق مهرافزون
خواندن ۴ دقیقه·۲ ماه پیش

تفاوت بین constructor و init در کاتلین

در کاتلین، constructors و بلوک‌های init برای مقداردهی اولیه کلاس‌ها استفاده می‌شوند، اما اهداف و ویژگی‌های متفاوتی دارند. در اینجا چهار تفاوت اصلی بین constructors و بلوک‌های init در کاتلین آمده است:

1. نحوه تعریف کردن و Syntax:

  • تعریف ‏‏Primary Constructor : در سربرگ کلاس، بلافاصله بعد از نام کلاس اعلام می‌شود.
  • تعریف Secondary Constructor: در بدنه کلاس با استفاده از کلمه کلیدی constructor اعلام می‌شود.

مثال:

بلوک init:

  • با استفاده از کلمه کلیدی init در داخل بدنه کلاس تعریف می‌شود.
  • یک کلاس می‌تواند چندین بلوک init داشته باشد که به ترتیبی که ظاهر می‌شوند اجرا می‌شوند.

مثال:

2. هدف ایجاد هرکدام به شرح زیر می باشد:

  • هدف ‏‏‏‏‏‏‏‏‏‏Primary Constructor‏: یک روش برای ساخت یک شیء از کلاس است که به شما امکان می‌دهد اطلاعات لازم را به آن بدهید. مثلاً وقتی یک کلاس کتاب دارید، سازنده اصلی می‌تواند نام کتاب و نویسنده را به عنوان ورودی بگیرد تا آن شیء ساخته شود.
  • هدف Secondary Constructor: اگر بخواهید constructor های بیشتری برای ساختن شیء داشته باشید، از Secondary Constructor استفاده می‌کنید. مثلاً اگر بخواهید کتابی را فقط با نام نویسنده و بدون سال انتشار بسازید، از ‏‏Secondary Constructor استفاده می‌کنید.
  • هدف بلوک init: برای انجام کارهای خاصی که نیاز به منطق پیچیده دارد یا وقتی می‌خواهید یک چیزی را بررسی کنید، استفاده می‌شود. مثلاً اگر بخواهید وقتی یک کتاب ساخته می‌شود، مطمئن شوید که سال انتشار منفی نباشد، از init استفاده می‌کنید. این بلوک بلافاصله بعد از اینکه سازنده اصلی کارش را انجام داد، اجرا می‌شود. این بلوک بلافاصله پس از سازنده اصلی اجرا می‌شود.

برای درک بهتر تفاوت‌ها، مثال زیر را مطالعه کنید:

فرض کنید می‌خواهیم یک کلاس برای اطلاعات یک کتابخانه بسازیم.

مثال ‏‏‏‏‏‏‏‏‏‏‏‏‏Primary Constructor‏:

برای پارامترهایی مانند نام کتاب، نام نویسنده و سال انتشار استفاده می‌شود. این سازنده به ما امکان می‌دهد که به سادگی اطلاعات اصلی یک کتاب را در هنگام ایجاد آن مقداردهی کنیم.

مثال ‏‏Secondary Constructor:

  • اگر بخواهیم راه‌های دیگری برای ساخت شیء از کلاس book ارائه دهیم، می‌توانیم از ‏‏Secondary Constructor استفاده کنیم. برای مثال، ‏‏Secondary Constructor می‌تواند حالتی را تعریف کند که فقط نام کتاب و نویسنده داده شود و سال انتشار به صورت پیش‌فرض صفر باشد.

مثال بلوک init:

  • اگر نیاز به اجرای منطق پیچیده‌تر یا اعمال برخی اطلاعات (مانند چاپ یک پیام خوش‌آمدگویی به محض ایجاد یک کتاب) داشته باشیم، می‌توانیم از بلوک init استفاده کنیم. این منطق بلافاصله بعد از مقداردهی اولیه اجرا می‌شود. به عنوان مثال، می‌توانیم بررسی کنیم که اگر سال انتشار منفی بود، یک پیغام خطا چاپ شود.

در این مثال، ‏‏‏‏‏‏‏‏‏‏Primary Constructor برای مقداردهی ویژگی‌ها استفاده می‌شود، ‏‏Secondary Constructor راهی جایگزین برای مقداردهی ارائه می‌دهد، و بلوک init برای بررسی‌های اضافه و اعمال منطق اضافی پس از مقداردهی استفاده می‌شود.

3. ترتیب اجرا:

‏‏‏‏‏‏‏‏‏‏‏‏اجرای Primary constructor به شکل است که این Constructor ابتدا اجرا می‌شود و سپس بلوک‌های init به ترتیب اجرا می‌شوند. اگر ‏‏Secondary Constructor وجود داشته باشد، آن باید به ‏‏ ‏‏‏‏‏‏‏‏‏‏Primary Constructor ارجاع دهد و بلوک‌های init بعد از اتمام کار ‏‏ ‏‏‏‏‏‏‏‏‏‏Primary Constructor اجرا می‌شوند.

4. مقداردهی ویژگی‌ها(Property):

مقداردهیPrimary Constructor : بهترین گزینه برای مقداردهی مستقیم ویژگی‌ها است. به این معنی است که می‌توانید به راحتی مقادیر ویژگی‌ها (Property) را هنگام ساخت شیء به آن‌ها بدهید.

مقداردهی‏‏Secondary Constructor : می‌تواند ویژگی‌ها را نیز مقداردهی کند، اما معمولاً برای یکپارچگی (سازگاری) به سازنده اصلی ارجاع می‌دهد تا کد تمیز و یکسانی داشته باشد.

مقدار دهی بلوک init : بلوک init برای مقداردهی ویژگی‌هایی که نیاز به منطق پیچیده دارند یا به ویژگی‌های دیگر وابسته‌اند، بسیار مفید است و می‌توان از آن برای تنظیم مقادیر پیش‌فرض یا انجام کارهای اضافی در زمان ساخت شیء استفاده کرد.

نتیجه گیری:

‏‏constructors در کاتلین عمدتاً برای انتقال پارامترها و مقداردهی به ویژگی‌ها به کار می‌روند، در حالی که بلوک‌های init برای اجرای منطق پیچیده‌ای هستند که باید بعد از سازنده اصلی اجرا شود. هر دو نقش مهمی در راه‌اندازی درست یک نمونه از کلاس دارند.


ممنون که تا آخر این پست همراه من بودید ، امیدوارم براتون مفید بوده باشه 🙌🙏✌ (:

بقیه آموزش های من با نام (mister developer) را می توانید در تلگرام و اینستاگرام دنبال کنید!!

کانال تلگرام: mister_developerr

اینستاگرام: mister_developerr

موفق و پیروز باشید







secondary constructorprimary constructorکاتلینkotlinبرنامه نویسی
شاید از این پست‌ها خوشتان بیاید