با طعم کد!

دو قدم جلوتر!

تفاوت و قابلیت همخوانی کاتلین با جاوا! :)

پاراگراف بعدی این مطلب شامل بازگوی خودمانی و صمیمی تجربه‌ای است که منجر به تولید این مطلب شده و در صورتی که عجله دارید!! می‌توانید از خواندن این پاراگراف صرف نظر کنید. 🙂

چند روز پیش که روی کلاینتِ اندروید پاد اسپیس کار می‌کردم و پروژه رو جلوتر می‌بردم، و طبق معمول به خاطر وسواسی که روی تمیز و استاندارد بودن کد دارم، مشغول مرتب کردن همزمان بعضی کلاس‌ها هم بودم، تقریبا هر بار که چیز جدیدی میفهمم که می‌دونم استانداردتر و بهتره، سعی می‌کند قسمت‌های مرتبط روی پروژه‌های فعال رو در همون رابطه بروز کنم. خلاصه توی همین گیر و دار متوجه شدم تقریبا حدود ۱.۶ درصد از پروژه رو با جاوا نوشتم!! اول از همه برای خودم جالب بود که پروژه‌ای که از پایه با جاوا شروع شده و شاید خیلی از قسمت‌هاش هم با جاوا پیاده شده، چطور به جایی رسیده که ۹۸.۴ درصدش رو کاتلین شکل بده! و خب تصمیم گرفتم که کلاس‌های جاوا رو که اکثرا کلاس‌های میانی بودن بخونم و بررسی کنم اگر زمان زیادی از من نمی‌گیره، به کاتلین تبدیلشون کنم. وسط خوندن یکی از کلاس‌ها متوجه شدم که برای استفاده از یکی از مدل‌های یا همون دیتا کلاس‌های کاتلین روی جاوا، سه‌تا constructor کاتلین ساخته شده. یا برای استفاده از یک متد با مقادیر اولیه، چند بار یک متد بازنویسی شده، اما چرا؟ واقعا اضافه نویسی یکی از چیز‌هایی هست که خیلی اذیت کننده و زشت به نظر می‌رسه.

اگر شما هم مثل من از دنیای جاوا به کاتلین وارد شده باشید، حنما استفاده از overload برای متدهای مختلف را تجربه کرده‌اید، که منجر به ساختن چندین بار از یک متد به شکل‌های مختلف می‌شود. اما در کاتلین را‌ه‌حل ساده‌تری وجود دارد، به این متد دقت کنید:

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

و همه این فراخوانی‌ها فقط و فقط با ساخت یک متد در کاتلین امکان‌پذیر است، یادآوری می‌کنم که برای اینکه بتوانیم در جاوا مانند مثال بالا، یک متد را فراخوانی کنیم باید از overloadهای مختلف یک متد (۴ بار تعریف) استفاده کنیم که در اینجا یک نمونه از آن را می‌بینید:

همانطور که انتظار داریم، مقدار پیش‌فرض برای constructor های مدل‌ها و دیتا کلاس‌ها در کاتلین هم قابل استفاده است:

و در نتیجه این آبجکت را می‌توان به شکل‌های مختلف ایجاد کرد:

و باز هم باید یادآوری کنم که برای این کار، نیاز به چند Constructor در کلاس جاوا داشتیم. اما…

اما اگر این متدها و کلاس‌هایی که در کاتلین ساخته شده را در کدِ جاوا فراخوانی کنیم چه اتفاقی می‌افتذ؟ متاسفم! این مقادیر پیش‌فرض درصورت فراخوانی از جاوا وجود ندارد! یعنی به بیان ساده‌تر می‌توان گفت: ترفند ما کار نمی‌کند! و نمی‌توانیم کد‌هایی شبیه به این داشته باشیم:

whats wrong with java?

پس چه بلایی سرِ شعارهایی شبیه به ۱۰۰ درصد همخوانی کاتلین با جاوا! آمد؟ خب نگران نباشید! :)) همه چیز با استفاده از یک نغییر کوچک کاملا سازگار خواهد شد. فقط نیاز داریم که حاشیه‌نویسی یا به زبان خودمانی‌تر annotation جادویی خودمان را به کد اضافه کنیم، که چیزی نیست جز @JvmOverloadsبرای مثال کد‌های قبلی به صورت زیر بازنویسی می‌شوند:

فقط باید همانطور که در قطعه کد بالا می‌بینید برای استفاده از @JvmOverloads در ساخت دیتا کلاس کاتلین، از کلمه کلیدی constructor نیز بعد از annotation استفاده کنید تا کاتلین بداند چه چیزی برای جاوا بازنویسی کند. بله درست متوجه شدید! کاتلین برای اینکه جاوا مقادیر پیش‌فرض را درک کند، متدها و سازنده‌های دیتا کلاس‌ها را بازنویسی می‌کند، اگر کد‌های بالا را دیکامپایل کنیم کاملا متوجه این مورد خواهیم شد و خواهیم دید که برای دیتا کلاس sample، نتیجه‌ی حاصل، چیزی شبیه به قطعه کد زیر خواهد بود:

و همینطور برای متد example:

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

برچسب ها
نمایش بیشتر

نوشته های مشابه

دیدگاهتان را بنویسید

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

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

بستن
بستن