ما قبلاً به این واقعیت عادت کرده ایم که یک نسخه جدید JDK هر شش ماه ظاهر می شود. تاکنون این رویکرد خود را توجیه کرده است و نگرانی برخی از توسعه دهندگان مبنی بر عدم همراهی با به روز رسانی ها بیهوده بوده است: تغییرات شش ماهه کمی وجود دارد و مانند گذشته جهانی نیستند. خب، برنامه نویسان تازه کار ممکن است اصلا متوجه این نوآوری نشوند. با این حال، بهتر است توسعه دهندگان نرم افزار آینده در جریان نوآوری ها باشند. در این مقاله، ما به طور سنتی پیشنهادهای توسعه پذیرفته شده (JEP) را شرح خواهیم داد. جاوا 13 شامل تنها پنج JEP و 76 عنصر کتابخانه هسته جدید است (که تقریباً نیمی از آنها افزودههای ساده به بسته java.io هستند).
JEP 355 : بلوک های متن (پیش نمایش)
بیایید با تغییر نحو زبان شروع کنیم. مهمترین آنها بلوک های متنی هستند. آنها به شما امکان می دهند از فرار از کاراکترها جلوگیری کنید و بدانید که چگونه رشته ها را قالب بندی کنید. ممکن است به یاد داشته باشید که JDK 12 ویژگی مورد انتظار Raw String Literals (JEP 326) را برای کار با string literals شامل نمی شد. در جاوا 13، JEP 355 با بلوک های متنی آن جایگزین شد. احتمالاً به یاد دارید که در جاوا، یک رشته در دو گیومه پیچیده می شود. این خوب است، اما مشکل این است که یک خط نمی تواند بیش از یک خط از فایل منبع را اشغال کند (برای جلوگیری از اشتباه گرفتن با یک خط جاوا، در اینجا ما یک خط فایل را "خط" می نامیم). خوب، بیایید به اطراف برویم و برای مثال از نماد\n
اگر نیاز به شکست است یا الحاق عبارات چند خطی استفاده کنیم. خیلی قشنگ نمیشه! متن تحت اللفظی با قطعات HTML، XML، SQL یا JSON تعبیه شده به ویژه دست و پا گیر هستند. این همه فرار، الحاق و ویرایش دستی کد را برای نوشتن ناخوشایند و خواندن را دشوار می کند. بلوک های متنی سعی در حل این مشکل دارند. اوه... با گیومه های سه گانه شروع می شوند و به آنها ختم می شوند (می دانم، خیلی خوب به نظر نمی رسد). همه چیز بین نقل قول به عنوان بخشی از خط تفسیر می شود، از جمله خطوط جدید. بلوک های متنی را می توان دقیقاً مانند متن استاندارد استفاده کرد و جاوا کد را به همان روش کامپایل می کند. نقل قول های باز باید با یک جداکننده خط دنبال شود. بلوک های متنی را نمی توان در یک خط استفاده کرد، بنابراین کد
String smallBlock = """Only one line""";
منجر به خطاهای زیر خواهد شد:
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
String smallBlock = """Text Block""";
^
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
String smallBlock = """Text Block""";
^
اکنون می توان یک قطعه ساده HTML را به صورت زیر نوشت:
String htmlBlock = """
<html>
<body>
<p>CodeGym Web page</p>
</body>
<html>
""";
اجازه دهید به چند نکته ظریف اشاره کنیم که بهتر است هنگام استفاده از بلوک های متنی از آنها آگاه باشید. قرار دادن نقل قول های پایانی مهم است: تعیین می کند که فضای سفید گاه به گاه چگونه مدیریت شود. در مثال بالا، نقل قول های پایانی با تورفتگی متن HTML تراز شده اند. در این حالت، کامپایلر فضاهای تورفتگی را حذف می کند و در نتیجه خطی مانند زیر دریافت می کنیم:
<html>
<body>
<p>My web page</p>
</body>
</html>
توجه داشته باشید:چنین خطی حاوی یک خط جدید در انتهای خط خواهد بود. اگر به آن نیاز نیست، نقل قول های بستن """ را می توان مستقیماً بعد از تگ </html> قرار داد. اگر نقل قول های پایانی را به حاشیه سمت چپ نزدیک کنیم، این مقدار تورفتگی حذف شده را تغییر می دهد. اگر آنها را دو فاصله به سمت چپ منتقل کنیم، به هر خط دو فاصله برای تورفتگی اضافه می کنیم. حرکت به لبه سمت چپ باعث می شود که تمام لایه ها حفظ شوند. انتقال نقل قول ها بیشتر به سمت راست تأثیری نخواهد داشت و هیچ تورفتگی دیگری اضافه نمی کند. بلوک های متن در JDK 13 به عنوان یک ویژگی پیش نمایش گنجانده شده است. این بدان معنی است که آنها هنوز در مشخصات زبان جاوای مربوطه گنجانده نشده اند. یعنی مشخص نیست که آیا این ویژگی به بخشی دائمی از زبان تبدیل می شود یا اینکه اینجا فقط یک مهمان است. در حال حاضر، توسعه دهندگان می توانند این ویژگی را آزمایش کرده و نظر خود را در مورد آن بیان کنند. سرنوشت بلوک های متنی به آن بستگی دارد: این ویژگی را می توان بهبود بخشید، و اگر آن را دوست ندارید، می توان آن را به طور کلی حذف کرد. اگر میخواهید بلوکهای متن را در عمل امتحان کنید، به یاد داشته باشید که ویژگیهای پیشنمایش باید به صراحت برای کامپایل و اجرا گنجانده شوند. تلفیقی:
javac --enable-preview --release 13 TextBlock.java
برای اجرای برنامه، باید ویژگی های پیش نمایش را فعال کنید:
java --enable-preview TextBlock
کلاس String
دارای سه روش جدید است که این تغییر زبان را تکمیل می کند:
formatted()
: یک رشته را با استفاده از خود رشته به عنوان رشته فرمت فرمت کنید. معادل چالشformat(this, args)
stripIndent()
: فاصله های تصادفی را از یک رشته حذف می کند. اگر رشتههای چند خطی را میخوانید و میخواهید همان رد فضای خالی را با یک اعلان صریح اعمال کنید، مفید است.translateEscapes()
: رشته ای را با دنباله های فرار (مانند\ r
) برمی گرداند که به مقدار یونیکد مناسب ترجمه شده است.
@PreviewFeature
به چنین موقعیت هایی کمک کند، اما هنوز در JDK گنجانده نشده است (اگرچه احتمال اینکه در JDK 14 ظاهر شود بسیار زیاد است).
JEP 354 : بیان سوئیچ (پیش نمایش)
جاوا 12 پیشنهادی را برای شکل جدیدی از نوشتن عبارات با دستور سوئیچ ارائه کرد - JEP 325 . معلوم شد که این اولین ویژگی پیشنمایش است و سرنوشت آن ثابت میکند که ارائه پیشنهادات به کاربران ایده خوبی است. قبل از JDK 12،switch
فقط میتوانست بهعنوان دستوری استفاده شود که عملی را انجام میدهد اما نتیجهای را بر نمیگرداند. switch
اما در جاوا 12 به آن اجازه می دهد تا به عنوان عبارتی استفاده شود که نتیجه ای را برمی گرداند که می تواند به یک متغیر اختصاص داده شود. تغییرات دیگری در نحو عبارات case در داخل وجود دارد switch
. بیایید به مثالی از JEP نگاه کنیم تا بفهمیم این چگونه کار می کند.
int numberOfLetters;
switch(dayOfWeek) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numberOfLetter = 6;
break;
case TUESDAY
numberOfLetter = 7;
break;
case THURSDAY
case SATURDAY
numberOfLetter = 8;
break;
case WEDNESDAY
numberOfLetter = 9;
break;
default:
throw new IllegalStateException("Huh?: " + day);
}
در این مثال، dayOfWeek
برای اختصاص مقدار به numberOfLetters
. با توجه به ویژگی های کار اپراتور switch
، این کد زیباترین نیست و اشتباه کردن آن آسان است. ابتدا، اگر فراموش کنیم که یک دستور را break
برای هر گروه از برچسبهای case اعمال کنیم، به طور پیشفرض به گروه بعدی از برچسبهای case خواهیم رفت. این می تواند منجر به خطاهایی شود که یافتن آنها دشوار است. دوم، ما باید هر گروه از برچسب ها را تعریف کنیم. اگر فراموش کنیم، مطمئناً با خطای کامپایلر مواجه خواهیم شد، اما این گزینه ایده آل نیست. کد ما نیز کاملاً پرمخاطب است، زیرا هر مقدار dayOfWeek
باید برچسب کوچک مخصوص به خود را داشته باشد. با استفاده از سینتکس جدید، کد بسیار تمیزتر و کم خطاتر دریافت می کنیم:
int numberOfLetters = switch (dayOfWeek) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> throw new IllegalStateException("Huh?: " + day);
};
اکنون فقط باید یک بار تخصیص را انجام دهیم (از مقدار بازگشتی عبارت switch
) و می توانیم از یک لیست جدا شده با کاما برای برچسب های حروف استفاده کنیم. و از آنجایی که ما از اپراتور استفاده نمی کنیم break
، مشکلات مربوط به آن را برطرف می کنیم. سینتکس عبارت switch
به ما امکان می دهد از نحو سبک قدیمی تر استفاده کنیم، بنابراین در JDK 12 می توانیم آن را به این صورت بنویسیم:
int numberOfLetters = switch (dayOfWeek) {
case MONDAY:
case FRIDAY:
case SUNDAY:
break 6;
case TUESDAY
break 7;
case THURSDAY
case SATURDAY
break 8;
case WEDNESDAY
break 9;
default:
throw new IllegalStateException("Huh?: " + day);
};
با توجه به جامعه جاوا، استفاده از بارگذاری بیش از حد break
برای تعیین مقدار بازگشتی می تواند گیج کننده باشد. زبان جاوا همچنین به شما امکان می دهد از break
(و continue
) با برچسبی مانند عملگر پرش بدون قید و شرط استفاده کنید goto
. JEP 354 این استفاده را تغییر داد break
، بنابراین در جاوا 13 کد ما کمی تغییر می کند:
int numberOfLetters = switch (dayOfWeek) {
case MONDAY:
case FRIDAY:
case SUNDAY:
yield 6;
case TUESDAY
yield 7;
case THURSDAY
case SATURDAY
yield 8;
case WEDNESDAY
yield 9;
default:
throw new IllegalStateException("Huh?: " + day);
};
سه JEP بعدی با ماشین مجازی جاوا مرتبط هستند.
JEP 350 Dynamic CDS Archive
این پسوند به شما امکان می دهد تا کلاس ها را به صورت پویا در پایان اجرای برنامه جاوا بایگانی کنید. CDS یا Class Data Sharing به شما امکان می دهد تمام کلاس های راه اندازی شده در هنگام راه اندازی راclass data sharing
با استفاده از لیستی از همین کلاس ها به طور پیش فرض در یک آرشیو ویژه قرار دهید. این منجر به شتاب قابل توجهی در راه اندازی برنامه ها و صرفه جویی در RAM می شود. پیش از این، استفاده از AppCDS یک فرآیند چند مرحلهای بود که شامل ایجاد فهرستی از کلاسهای مرتبط و استفاده از آن فهرست برای ایجاد آرشیوی بود که برای اجراهای بعدی استفاده میشد. اکنون تنها چیزی که مورد نیاز است یک بار راه اندازی برنامه با پرچم -XX: است که ArchiveClassesAtExit
نشان دهنده مکانی است که آرشیو در آن نوشته می شود. با این رویکرد، کلاس ها به طور خودکار پس از توقف برنامه به طور معمول در یک آرشیو بسته بندی می شوند.
JEP 351 ZGC : حافظه استفاده نشده را غیرفعال کنید
یک سال پیش، JDK 11 ZGC را معرفی کرد، یک زباله جمعکننده آزمایشی، مقیاسپذیر و کم تأخیر. در ابتدا، ZGC نسبتاً عجیب رفتار کرد: اجازه نمی داد حافظه به سیستم عامل بازگردانده شود، حتی اگر دیگر مورد نیاز نباشد. برای برخی از محیطها، مانند کانتینرها، که منابع توسط چندین سرویس به طور همزمان استفاده میشوند، این ممکن است مقیاسپذیری و کارایی سیستم را محدود کند. پشته ZGC شامل به اصطلاح ZPages است. هنگامی که ZPages در طول چرخه جمع آوری زباله پاک می شوند، به ZPageCache بازگردانده می شوند. ZPages موجود در این کش بر اساس آخرین استفاده از آنها مرتب می شوند. در جاوا 13، ZGC صفحاتی را که برای مدت طولانی مورد استفاده قرار نگرفته اند را به سیستم عامل باز می گرداند. به این ترتیب می توان از آنها برای سایر فرآیندها استفاده مجدد کرد.JEP 353 API قدیمی Socket را دوباره پیاده سازی کنید
هر دو پیاده سازی API هنوز JDK 1.0java.net.Socket
هستند . java.net.ServerSocket
در این و همه JDK های بعدی، پیاده سازی این API ها از چندین تکنیک (مانند استفاده از پشته نخ به عنوان یک بافر ورودی/خروجی) استفاده می کند که باعث انعطاف ناپذیری و نگهداری آنها می شود. برای حل این مشکل، پیاده سازی جدیدی در JDK 13 ارائه شد NioSocketImpl
. این دیگر نیازی به کد بومی ندارد و انتقال آن به پلتفرم های مختلف را آسان تر می کند. این کلاس همچنین از مکانیسم کش بافر موجود (اجتناب از استفاده از پشته نخ برای این منظور) و قفل کردن java.util.concurrent
به جای روش های همگام استفاده می کند. این یکپارچگی با الیاف Project Loom را ساده می کند .
API های جدید
قبلاً اشاره کردیم که جاوا 13 شامل 76 API جدید در کتابخانه های کلاس پایه است. آنها حوزه های زیر را پوشش می دهند:- به روز رسانی های پشتیبانی از یونیکد
- سه روش جدید
String
برای پشتیبانی از بلوک های متنی (به شرح JEP 255 در بالا مراجعه کنید). - کلاس ها
java.nio
در حال حاضر مطلق (در مقابل نسبی)get
وروش ها را تنظیم کنید آنها، مانند کلاس انتزاعی پایه Buffer
، شامل روشیslice()
برای بازیابی بخشی از بافر هستند. - متد
force()
کلاسMappedByteBuffer
یک بخش بافر را مجبور میکند تا در حافظه پشتیبان آن نوشته شود. nio.FileSystem
سه فرم اضافه بار جدیدnewFileSystem()
برای دسترسی به محتویات یک فایل به عنوان یک سیستم فایل اضافه می کند.- یک روش جالب جدید ظاهر شده است
javax.annotation.processing.ProcessingEnvironment
.isPreviewEnabled()
. به شما می گوید که آیا ویژگی های پیش نمایش فعال هستند یا خیر. این جالب است زیرا حاشیه نویسی ذکر شده در بالا@PreviewFeature
تا زمانی که JDK 14 منتشر نشود در دسترس نخواهد بود. DocumentBuilderFactory
و سه روش جدید برای ایجاد نمونه های آگاه از فضای نامSAXParserFactory
دریافت کنید .javax.xml.parsers
GO TO FULL VERSION