جاوا یا کاتلین : تفاوت این دو زبان در برنامه نویسی اندروید چیست؟

  • آخرین بروزرسانی در دوشنبه 20 ژانویه 2020

    Average rating 5 / 5. Vote count: 1

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

در حال حاضر، اندروید استودیو به صورت پیشفرض از زبان کاتلین پشتیبانی می کند و ایجاد یک پروژه اندروید که بتوان در آن از زبان کاتلین استفاده کرد به سادگی انتخاب نام این زبان در هنگام طی کردن مراحل ساخت پروژه است.

انتخاب زبان کاتلین در ایجاد پروژه در اندروید استودیو

اما این که از جاوا به کاتلین مهاجرت کنید یا این که اگر تازه می خواهید برنامه نویسی اندروید را شروع کنید، به سراغ کاتلین بروید، چه مزیتی دارد که در جاوا نیست؟

کم شدن حجم کد نویسی در کاتلین

اگر یک کلاس در کاتلین را با یک کلاس در جاوا که کارکرد یکسانی دارند، مقایسه کنید، کلاس کاتلین خلاصه تر و به اصطلاح شسته رُفته تر است؛ اما به طور ویژه در یک مورد خاص کاتلین در اندروید به شدت کد های اضافی را از برنامه شما حذف می کند و آن عدم نیاز به وصل یا Bind کردن یک View است.

افزونه های اندروید در زبان کاتلین این امکان را می دهند تا مرجع یک View در فایل Activity را در کد های خود درون ریزی یا Import کنید؛ در این صورت می توانید با آن View کار کنید. به عبارت دیگر در زبان کاتلین دیگر به دستور زیر نیازی ندارید.

findViewById();

به این منظور فقط می بایست افزونه مربوط به آن را در فایل bulid.gradle سطح ماژول اضافه کنید که البته این کار را خود اندروید استودیو برای شما انجام می دهد؛ اما فقط جهت آشنایی، کد زیر می بایست در فایل گفته شده باشد.

apply plugin: 'kotlin-android-extensions'

حالا فرض کنید در فایل MainActivity.xml پروژه خود یک TextView با ID یا شناسه myTextview دارید؛ برای تعیین متن آن در فایل کاتلین مربوط به این لایه، کد زیر را بنویسید.

myTextView.setText("Hello World");

پس از نوشتن دستور بالا، اندروید استودیو به صورت خودکار کتابخانه مربوط به آن را که در ادامه می بینید، درون ریزی می کند.

import kotlinx.android.synthetic.main.activity_main.*

اگر می خواستید همین کار را در جاوا انجام بدید، می بایست دو دستور زیر را می نوشتید.

TextView text = (TextView) findViewById(R.id.myTextView);
text.setText("Hello World");

Null در کاتلین

NullPointerException ها برای توسعه دهندگان جاوا موضوع آزار دهنده ای است. جاوا به شما این امکان را می دهد که مقدار null را به هر متغیری نسبت بدهید ولی اگر بخواهید از یک شی یا Object استفاده کنید که مقدار null داشته باشد، در این صورت باید خود را برای حالتی که NullPointerException رخ دهد، آماده کنید.

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

val name: String = null
fun getName() : String = null

اما اگر واقعا بخواهید که در کاتلین مقدار یک متغیر را null قرار بدید، می بایست پس از تعیین نوع متغیر یک علامت سوال بنویسید.

val number: Int? = null

گسترش کلاس ها در کاتلین

کاتلین به توسعه دهندگان این امکان را می دهد تا یک کلاس را با اضافه کردن یک کارکرد جدید گسترش دهند؛ این قابلیت زمانی کاربردی است که احساس می کنید که یک کلاس به یک method مهم نیاز دارد که باید به آن اضافه کنید.

این قابلیت در زبان جاوا در دسترس نیست ولی در زبان های دیگری مانند زبان C در دسترس است اما حالا با کاتلین هم می توانید به این قابلیت در اندروید دسترسی داشته باشید.

برای اضافه کردن یک متد به یک کلاس می بایست ابتدا نام آن کلاس را بیاورید و یک نقطه بگذارید و سپس نام متد مورد نظر را بنویسید.

fun String.styleString(): String {
// Style the string and then return it//
}

در کد بالا، به کلاس String یک متد به نام styleString اضافه می شود.

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

myString.styleString()

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

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

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

اگر چه در کاتلین هم می توانید نخ را مانند گذشته ایجاد کنید، می توان از مفهومی به نام Coroutine هم استفاده کرد. Coroutine ها، وظایف سنگین و دراز مدت را با مسدود کرد اجرا در یک مواقع خاص و بدون مسدود کردن نخ و سپس ادامه دادن آن قابلیت در زمانی دیگر اجرا می کنند. با استفاده از این قابلیت به شما این امکان داده می شود تا کد های ناهمزمان (Asynchronous) که مانند کد های همزمان به نظر می رسند را اجرا کنید؛ این کد ها ساده تر و توسط انسان قابل درک تر هستند.

fun main() { 
println("Hello,")
// we create a coroutine running the provided suspending lambda
// and block the main thread while waiting for the coroutine to finish its execution
runBlocking {
    // now we are inside a coroutine
    delay(2000L) // suspends the current coroutine for 2 seconds
}

// will be executed after 2 seconds
println("World!")
  }

Coroutine ها نیازی هم به پشته ندارند و بنابراین نسبت به نخ ها حافظه کمتری مصرف می کنند.

Exception در کاتلین

در زبان کاتلین هیچ Exception بررسی شده ای وجود ندارد و بنابراین نیازی نیست آن ها را Catch کنید.

اما این که این موضوع خوب است یا بد بستگی به نظر شما دارد چرا که همین موضوع بسیاری را از کاتلین دور و بسیاری را هم به کاتلین نزدیک می کند.

پشتیبانی از Delegation در کاتلین

Delegation کلاس در کاتلین جایگزین وراثت است که امکان استفاده از چند وراثت را می دهد.

class Delegate {
    operator fun getValue(...)
...
...
...
    }

    operator fun setValue(...)
...
...
...
    }
}

حالا وقتی یک Property ایجاد می کنید، می توانید تعیین کنید که توابع Getter و Setter برای آن ایفای نقش کنند.

class MyClass {
var property: String by Delegate()
}

ساده تر شدن تعریف کلاس در کاتلین

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

به عبارت دیگر باید یک سازنده یا Constructor برای کلاس، متغیر برای نگهداری از داده ها، توابع Getter و Setter و توابع hashCode، equals و toString را تعریف کنید.

در کاتلین، اگر در تعریف کلاس تان کلیدواژه “data” را بیاورید، کامپایلر خودش تمام کارهایی که در پاراگراف قبل گفتیم را انجام می دهد.

data class Date(var month:String, var day: Int)

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

در جاوا، شما می بایست همیشه نوع داده را بررسی کنید و سپس آن را به حالتی Cast یا تبدیل کنید قبل از آن هم مشخص است که آن متغیر همان نوع را دارد.

تبدیل نوع هوشمند در کاتلین تبدیل های غیر ضروری و تکراری را حذف می کند و نیازی نیست که پس از بررسی نوع یک متغیر آن را به یک نوع داده تبدیل کنید و فقط کافی است که با اپراتور “is” نوع آن متغیر را بررسی کنید. برای مثال، کامپایلر می داند که تبدیل زیر بدون مشکل است.

if (hello is String) {
    printString(hello)
}

تبدیل نوع عددی کوچک به بزرگ در کاتلین

کاتلین از تبدیل اعداد از یک نوع کوچک به نوع بزرگ وجود ندارد؛ برای مثال شما نمی توانید به صورت پیشفرض یک متغیر از نوع Boolean را به Integer تبدیل کنید.

fun Boolean.toInt() = if (this) 1 else 0

در کد بالا تبدیل ضمنی یک متغیر Boolean به Integer را به کمک خاصیت گسترش کلاس ها در کاتلین می بینید.

Annotation در کاتلین

کاتلین از تمامی فریمورک ها و کتابخانه های جاوا شامل آن هایی که از Annotation Processing هم استفاده می کنند، پشتیبانی می کند؛ اگر چه بعضی از کتابخانه های جاوا همین حالا هم افزونه های کاتلین خود را مانند RxKotlin ارائه کرده اند.

اگر بخواهید از یک کتابخانه جاوا استفاده کنید که آن کتابخانه از Annotation Processing استفاده می کند، در این صورت اضافه کردن آن کتابخانه به پروژه کاتلین کمی متفاوت است چرا که باید Dependency مورد نظر را با استفاده از پلاگین kotlin-kapt به جای annotationProcessor مشخص کنید.

//Apply the plugin//
apply plugin: 'kotlin-kapt'

//Add the respective dependencies using the kapt configuration//

dependencies {
    kapt "com.google.dagger:dagger-compiler:$dagger-version"
...
...
...
}
برای دنبال کردن نوشته های کاپ کد به کانال تلگرامی آن (cupcode_ir@) بپیوندید!

دیدگاه خود را بیان کنید

@