آموزش kotlin – بخش اول

کاتلین Kotlin آموزش اندروید کوتلین کتلین کُتلین android tutorial جاوا java مقایسه کاتلین چیست

سطح آموزش: #مقدماتی

این بخش از آموزش رو بر اساس مقدمات و فصول ابتدایی کتاب Kotlin For Android Developer می‌نویسم. اگر کتاب رو خوندین میتونید از مطالعه این پست صرف نظر کنید.

Null Safety

یک بخش زیادی از انرژی ما موقع برنامه‌نویسی تو جاوا صرف این مسئله میشه که متغیرها رو قبل از استفاده چک کنیم که null هستن یا نه. اگر هم به این مسئله بی‌توجه باشیم سر و کارمون میفته به NullPointerException معروف.

اما کاتلین مثل خیلی از زبان‌های جدیدتر null safe هست. به این معنی که اگر objectـی بخواد بتونه null باشه باید صراحتا اعلام کنیم وگرنه object بطور پیش‌فرض نمیتونه null باشه.

یک object نمیتونه به طور پیش‌فرض null باشه پس خط زیر compile error میده:

اگه بخوایم یک object رو null بذاریم باید صراحتا و با ? مشخص کنیم:

حالا دو خط کد زیر رو نگاه کنید:

خط اول متد doSth کامپایل نمیشه چرا که myObject2 ممکنه null باشه. خط دوم هم فقط زمانی اجرا میشه که myObject2 مقدار null نباشه.

یک زمانی هم هست مطمئن هستیم متغیر ما null نخواهد بود و میخوایم اجرا کنه متد رو. میتونیم از !! استفاده کنیم:

در این صورت اگه null باشه هم کد اجرا میشه و NullPointerException میده. همچنین میتونیم مثل جاوا چک کنیم که اگر objectمون null نبود کد اجرا شه و در اون صورت ? هم نیاز نیست. اما خب لزومی نداره این کارو کنیم.

Extension Function

برای خود من یکی از جالب‌ترین ویژگی‌های کاتلین extension functionهاش هست. به مقدار خیلی زیادی باعث خوانایی و تمیزی کد میشه.

توی پروژه‌ها همیشه یکسری کلاس داریم که معمولا تو پوشه‌ای به اسم utility میذاریم. مثلا کلاسی که اعداد رو سه تا سه تا جدا میکنه و تومان/ریال به انتهاش اضافه می‌کنه. یا کلاسی که یک متن رو میگیره و toast نشون میده و…

کاتلین یک قابلیتی داره که به ما اجازه میده به هر کلاسی extension function اضافه کنیم. برای مثال به Fragment یک متدی اضافه کنیم که toast نمایش بده:

حالا داخل هر فرگمنتی میتونیم به شکل زیر یک Toast نمایش بدیم:

Lambda

جاوا کلاس‌های داخلی و ناشناس زیادی داره. مثلا OnClickListener رو قبلا مثالش رو دیدیم. با لامبدا ما میتونیم بدون توجه به این کلاس‌ها کد بزنیم. برای دیدن مثال به همون پست قبل برید.

نسخه غیررسمی‌ای از اندروید استودیو ۳ اومده که از جاوا ۸ پشتیبانی می‌کنه. توی این نسخه (که خودِ منم استفاده می‌کنم) خیلی راحت میتونید از این قابلیت استفاده کنید چون مخصوص جاوا ۸ هم هست. اما برای نسخه‌های قبلی هم کتابخونه‌ی Retrolambda هست که اجازه استفاده از lambda روی جاوا ۷ و ۶ و ۵ رو هم میده.

کلاس‌ها در کاتلین

تعریف کلاس با استفاده از keywordـه class انجام میشه. به شکل زیر:

به طور پیش‌فرض کلاس‌ها default constructor بدون ورودی دارن.

اگر بخوایم کلاسی با constructorـی که دیتا میگیره و set می‌کنه بنویسیم به شکل زیر می‌نویسیم:

دیگه نیاز نداریم بدنه constructor رو بنویسیم و متغیرهامون رو مقداردهی کنیم. البته اگه نیاز داشته باشیم کاری داخل constructor انجام بدیم میتونیم به شکل زیر عمل کنیم:

داخل بلاک init میشه برای constructor کد نوشت.

نکته: داخل کاتلین برعکس جاوا ما ابتدا اسم متغیر رو می‌نویسیم و بعد نوع اون رو مشخص می‌کنیم.

ارث‌بری در کاتلین

به طور پیش‌فرض کلاس‌ها از Any ارث‌بری میکنن. Any کلاسیه مثل Object داخل جاوا.

کلاس‌ها هم به طور پیش‌فرض closed هستن. برای اینکه از یک کلاس بتونیم ارث‌بری کنیم اون کلاس باید open باشه.

توجه کنید که وقتی از یک کانستراکتور استفاده می‌کنیم باید مقادیر constructor کلاس پدر رو مشخص کنیم. این مسئله معادل صدا کردن super داخل جاوا هست.

Functions

با استفاده از keywordـه fun متدها رو تعریف می‌کنیم:

اگه نوع مقدار بازگشتی رو مشخص نکنید به طور پیش‌فرض Unit برمیگردونه که مشابه void داخل جاوا هست با این تفاوت که Unit واقعا یک objectـه.

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

توی اندروید استودیو اگر به شکل بالا کلاس رو بنویسید بهتون میگه که نیازی به براکت گذاشتن نیست و warning میده و توصیه می‌کنه حذفشون کنید:

یک قابلیتِ خیلی کاربردی امکان تعریف default value داخل کاتلین هست. به این شکل که اعلام می‌کنیم اگر کاربر مقداری رو برای متغیر در نظر گرفت تابع از اون مقدار استفاده کنه در غیر اینصورت از یک مقدار پیش‌فرض که از قبل تعیین کردیم استفاده بشه. مثالش هم بالاتر برای toast دیدیم که اگر زمان toast مشخص نشده بود از LENGTH_SHORT به طور پیش‌فرض استفاده میشد:

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

نکته: احتمالا تا حالا متوجه شدید که توی کاتلین نیازی به semi-colon نداریم.

نکته: توی کاتلین میتونیم String هایِ پیچیده‌ای رو به شکلی ساده بنویسیم. مثلا فرض کنید مقدار “My Toast”رو به عنوان ورودی message گرفتیم و دوست داریم بنویسیم:

your message is: My Toast

برای نوشتن این عبارت یک String به این شکل نیاز داریم:

همچنین میتونیم به طور مستقیم از متغیرهای کلاس‌ها استفاده کنیم:

فقط برای متغیرهای کلاس‌ها استفاده از براکت رو نباید فراموش کنید.

پی‌نوشت: علاوه بر اندروید استودیو میتونید از این لینک هم استفاده کنید و کدهاتون رو آنلاین کامپایل کنید. یکسری مثال خیلی خوب هم داره که حتما نگاه کنید.

14 دیدگاه برای “آموزش kotlin – بخش اول

  1. سلام، وقتتون بخیر
    ضمن تشکر از آموزش جامعتون یه سوال داشتم
    من میخوام توی برنامه م یه سیستم کامنت گذاری هم داشته باشم، مثلا یه عکس یک کاربر بذاره و بقیه کاربرها بتونن کامنت بذارن براش، این کامنتها میتونه شامل عکس هم باشه حتی.
    خواستم بپرسم برای این کار آیا کتابخونه یا سرویس جامعی وجود داره یا خودم باید از صفر پیاده سازی کنم؟ آیا برنامه یا سورس کدی میشناسید که بتونم استفاده کنم؟ یا مطالبی که باید مسلط باشم تا بخوام از صفر همچین چیزیو بنویسم؟
    متشکر و ممنون 🙂

    1. سلام. کار با دیتابیسه. نمونه کدش احتمالا توی سورس کدهای شبکه اجتماعی که تو اینترنت هست باشه. خودتم بخوای بزنی اینجوریه که یه Table برای کامنت توی دیتابیس درست میکنی که اطلاعات رو داخلش ذخیره میکنی. ساده‌ترین روش اینه که دو تا فیلد داخل table میذاری hasImage و imageUrl که کامنت اگه عکس داشت (hasImage = true) آدرسش رو داخل imageUrl ذخیره میکنی.

  2. سلام. ممنون بابت آموزش. یه سوال اینکه من این قسمت رو متوجه نمیشم:

    کاتلین یک قابلیتی داره که به ما اجازه میده به هر کلاسی extension function اضافه کنیم. برای مثال به Fragment یک متدی اضافه کنیم که toast نمایش بده:
    حالا داخل هر فرگمنتی میتونیم به شکل زیر یک Toast نمایش بدیم

    یه کم گنگه برام

    1. سلام. ببین مثلا میخوایم یک float رو بگیریم و یه بلایی سرش بیاریم. توی جاوا برای اینکار یک تابع می‌نویسیم که ورودی float میگیره و کاری که میخوایم رو انجام میده. در نهایت هم هروقت بخوایم این کارو انجام بدیم باید تابع رو call کنیم. حالا توی کاتلین بخوایم این کارو کنیم میتونیم با extension function ها یک تابع به کلاس Float اضافه کنیم و بعد هروقت خواستیم اون تابع رو استفاده کنیم مثل متدهای داخلی float باهاش رفتار میکنیم.

      1. خوبه الان متوجه شدم. حالا حسن utility این هستش که میشه همه جا ازش به عنوان یه static method استفاده کرد. با این قابلیت فکر میکنم نمیشه درسته؟

    1. سلام. آره تو برنامم بود که ادامه داشته باشه متاسفانه مشغله کاری باعث شد از کارای سایت عقب بیفتم. سعی می‌کنم به زودی آموزش‌ها به روال سابق برگرده.

پاسخ دهید

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