جاوا 9 و 9 فیچر جدید آن

بیش از سه سال پس از ورود جاوا 8 به بازار ورژن جدید آن در تاریخ احتمالی بیست و یکم سپتامبر 2017 به بازار معرفی خواهد شد. شاید درباره ی سیستم ماژول جاوا 9 شنیده باشید اما این ورژن جدید علاوه بر این سیستم ماژول 9فیچر جدید دارد که در این مقاله به آنها اشاره میشود.

 

سیستم ماژول پلتفرم جاوا

ویژگی که جاوا 9 را تعریف میکند سیستم ماژول کاملا جدید آن است. هنگامیکه کدبیس ها(codebases) بزرگتر میشوند احتمال بوجود آمدن اسپاگتی کد(spaghetti code) پیچیده افزایش می یابد. در اینجا دو مشکل اساسی وجود دارد: دشوار بودن خلاصه (کپسوله) کردن کدها و دوم اینکه بین قسمت ها یا فایل های JAR مختلف، مفهوم روشنی از وابستگی وجود ندارد. هرکلاس عمومی در classpath می تواند در دسترس کلاس عمومی دیگر قرار گیرد که به استفاده سهوی از کلاس هایی که قرار نبوده )API واسط برنامه ریزی اپلیکیشن) باشند منجر میشود. بعلاوه خود classpath نیز مشکل ساز است. مساله اینجاست که چطور میتوان فهمید که آیا تمام JAR های لازم وجود دارند یا اینکه تعداد ورودی ها دوبرار شده است؟ سیستم ماژول به هردو مساله رسیدگی میکند.
فایل های
JAR ماژولار یک واصف ماژول اضافی را شامل میشوند. در این واصف ماژول وابستگی به سایر ماژول ها از طریق توضیحات "requires" (بایدها) بیان میشوند. همچنین این توضیحات "exports" هستند که کنترل میکنند کدام پکیج ها در دسترس سایر ماژول ها باشند. تمام پکیج های صادر نشده (non- exported) در ماژول بصورت پیش فرض کپسول میشوند. در تصویر زیر یک نمونه از واصف ماژول را می بینید که در module-info.java زندگی میکند:
 

 

دقت کنید هردو ماژول شامل پکیج هایی (سپرهای نارنجی رنگ) هستند که بدلیل صادر نشده بودن خلاصه(کپسول) شده اند. هیچ کس نمی تواند بطور تصادفی کلاس هایی از این پکیج ها را استفاده کند. پلتفرم جاوا با استفاده از سیستم ماژول خود مودالریزه (ماژولاریزه) میشود. از طریق کپسوله کردن کلاس های درونی JDK ، پلتفرم جاوا ایمن تر شده، رشد و تکامل آن آسانترمیشود.
هنگامیکه یک اپلیکیشن ماژولار را آغاز میکنید،
JVM تایید میکند که آیا همه ماژول ها براساس توضیحات "requires" می توانند resolved شوند یا خیر که در مقایسه با classpath شکننده و بی دوام گامی بزرگ محسوب میشود. ماژول ها به شما اجازه میدهند تا از طریق اجرای قدرتمند تلفیق داده ها(encapsulation) و وابستگی های واضح، اپلیکیشن خود را بهتر سازماندهی کنید.

 

لینکینگ

هنگامیکه ماژول ها را بهمراه وابستگی های واضح و JDK مودالریزه دراختیار دارید ظهور فرصت ها و امکانات جدید افزایش می یابند. ماژول های اپلیکیشن شما وابستگی های خود به سایر ماژول های اپلیکیشن و ماژول هایی که از JDK استفاده میکند را بیان میکند. پس چرا از این اطلاعات برای خلق یک محیط runtime مینیمال که فقط شامل ماژول های ضروری برای اجرای اپلیکیشن میشود، استفاده نکنید. این امر با ابزار jlink در جاوا 9 ممکن شده است. بجای اپلیکیشن خود با نصب کامل JDK می توانید یک runtime مینیمال بهینه سازی شده برای اپلیکیشن خود خلق کنید.

 

JShell: REPL تعاملی جاوا

بسیاری از زبان ها از مدت ها قبل به مشخصه ی REPL فعل و انفعالی مجهز شده اند اما زبان برنامه نویسی جاوا بتازگی به جمع آنها پیوسته است. شما می توانید از کنسول، jshell را اجرا کرده سپس اجرای کد جاوا و تایپ کردن را بطور مستقیم آغاز کنید. بازخورد بی درنگ jshell آنرا به ابزاری بینظیر برای کاوش API ها و آزمایش فیچرهای زبان مبدل کرده است.
 

 

تست regular expression(عبارات معمول) جاوا نمونه ای بینظیر است که چگونه jshell می تواند زندگی شما را آسانتر کند. این shell تعاملی برای محیط های آموزشی و افزایش بهره وری نیز مناسب است.

 

Javadoc اصلاح شده

گاهی اوقات چیزهای کوچک تغییرات بزرگی ایجاد میکنند. آیا تابحال برای پیدا کردن صفحات javadoc مناسب همیشه از گوگل استفاده میکردید؟ دیگر نیازی به استفاده از گوگل نیست. از این پس می توانید این صفحات را در API documentation جستجو کنید. به این ترتیب از این پس خروجی javadoc با HTML5 سازگار است. بعلاوه متوجه خواهید شد که تمام صفحه های javadoc اطلاعاتی را شامل میشوند که از ماژول JDK یا واسط بدست می آیند.
 

 

متدهای Collection Factory

اکثرا تمایل دارند در کدهای خود یک کالکشن (بعنوان مثال یک لیست یا یک مجموعه) بسازند و سپس مسقیما آنرا با برخی از المان ها اشغال کنند. این کار به تکرار کدها منجر میشود. در ورژن جدید جاوا چند متد که کالکشن فکتوری نام دارند افزوده شده است :

 

علاوه بر کوتاه تر و زیباتر بودن این متدها برای خواندن دیگر نیازی به پیاده سازی یک کالکشن خاص ندارید. درواقع با استفاده از متدهای کالکشن فکتوری کالکشن اجرا شده برای المان های مورد نظر بسیار بهینه شده است. این امر بدلیل تغییر ناپذیر بودن آن ممکن است: افزودن آیتم ها به این کالکشن ها بعد از اینکه ساخته شدند به یک "استثنای اجرایی پشتیبانی نشده" منجر میشود.

 

بهسازی استریم API

استریم API یکی از بهترین پیشرفت ها در لایبرری استاندارد جاوا محسوب میشود. با این استریم می توانید در کالکشن ها خطوط انتقالی ایجاد کنید. این مشخصه در جاوا 9 بهسازی شده است. در این ورژن چهار متد جدید به واسط استریم افزوده شده است: drpoWhile، takeWhile، ofNullable. و یک متد تکراری با اورلود جدید:
 

 

نکته ی دیگر لاندایی است که تا زمانیکه المان فعلی در InntStream برابر صد شود اجرا میشود((returns true. بنابراین این اعداد صحیح از یک تا نودونه را در کنسول چاپ میشوند.
علاوه بر موارد نامبرده که به استریم افزوده شده است، یکپارچه سازی میان
Optional و Stream نیز بهسازی شده است. به این ترتیب می توانید با متد استریم جدید در آپشنال، یک آبجکت آپشنال را به استریم تبدیل کنید:

 

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

 

متدهای واسط شخصی

جاوا 8 در واسط ها چند متد پیش فرض دارد. اما اکنون یک واسط می تواند علاوه بر تاثیر متد دارای رفتار هم باشد. اما چه خواهد شد اگر در یک واسط با کد چندین متد پیش فرض داشته باشیم (کدهایی که کاری مشابه این متدها انجام میدهند)؟ بطور نرمال باید این متدها را refactor(بازبینی) کرده تا به یک متد شخصی با کارکرد مشترک دست یابید. اما متدهای پیش فرض نمی توانند شخصی باشند. راه حل در خلق یک متد پیش فرض با کدهای مشترک نیست زیرا این متدکمک کننده به جزیی از API عمومی تبدیل میشود. در جاوا 9 می توانید برای حل این مشکل متدهای کمک کننده ی شخصی را به واسط اضافه کنید:
 

 

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

 

HTTP/2

جاوا 9 یک روش جدید برای اجرای HTTP دارد. این روش جایگزینی برای 'Http URL Connection' است که WebSocket و HTTP/2 را نیز پشتیبانی میکند. هشدار: در جاوا 9 HttpClient API جدید، ماژول incubator نام دارد، به این معنا که صد در صد بودن API گارانتی نشده است. اما پیش از ورود جاوا 9 به بازار می توانید از این API استفاده کنید:
 

 

علاوه براین مدل درخواست/پاسخ، HttpClient برای رسیدگی به فیچرهای HTTP/2 همچون استریم و سرور پوش(server push) API های جدیدی فراهم میکند.

 

JAR های مولتی ریلیز(Multi- release)

آخرین فیچری که به آن اشاره میکنیم برای نگهدارندگان کتابخانه(لایبرری) خبری خوش است. هنگامیکه یک ورژن جدید از جاوا به بازار می آید سال ها زمان نیاز است تا تمام کاربران کتابخانه ی شما به استفاده از این ورژن جدید روی آوردند. بعبارت دیگر کتابخانه باید با نسخه ی قدیمی جاوا که قصد پشتیبانی از آنرا دارید (در بیشتر مواقع جاوا 6 یا جاوا 7) سازگار باشد. درواقع شما نمی توانید برای مدت ها از فیچرهای جدید جاوا 9 در کتابخانه ی خود استفاده کنید. خوشبختانه فیچر JAR مولتی ریلیز به شما اجازه می دهد تا ورژن های جانشین از کلاس هایی را استفاده کنید که تنها درصورت پیاده سازی کتابخانه در یک ورژن خاص از جاوا می توایند از آنها استفاده کنید:
 

 

در این مورد multirelease.jar را می توان در جاوا 9 استفاده کرد. این JAR هنوز در نسخه های قبلی جاوا کارمیکند.

 

 

جاوا 9 و 9 فیچر جدید آن
دوشنبه 13 شهریور 1396 - 09:45:47 4325 آخرین بازدید : سه شنبه 4 اردیبهشت 1403 - 23:36:17 0
*
*