JavaRush /وبلاگ جاوا /Random-FA /جاوا 13: ویژگی های جدید

جاوا 13: ویژگی های جدید

در گروه منتشر شد
ما قبلاً به این واقعیت عادت کرده ایم که یک نسخه جدید JDK هر شش ماه ظاهر می شود. تاکنون این رویکرد خود را توجیه کرده است و نگرانی برخی از توسعه دهندگان مبنی بر عدم همراهی با به روز رسانی ها بیهوده بوده است: تغییرات شش ماهه کمی وجود دارد و مانند گذشته جهانی نیستند. خب، برنامه نویسان تازه کار ممکن است اصلا متوجه این نوآوری نشوند. جاوا 13: ویژگی های جدید - 1با این حال، بهتر است توسعه دهندگان نرم افزار آینده در جریان نوآوری ها باشند. در این مقاله، ما به طور سنتی پیشنهادهای توسعه پذیرفته شده (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) برمی گرداند که به مقدار یونیکد مناسب ترجمه شده است.
جالب است که این روش‌ها به تازگی ظاهر شده‌اند، اما قبلاً به‌عنوان منسوخ علامت‌گذاری شده‌اند ... این وضعیت نشان می‌دهد که ممکن است در نسخه آینده JDK حذف شوند. اضافه کردن یک روش جدید و بلافاصله کنار گذاشتن آن کمی عجیب به نظر می رسد. با این حال، لطفاً توجه داشته باشید که این روش‌ها با یک ویژگی پیش‌نمایش مرتبط هستند که می‌تواند تغییر یا حذف شود. شاید معرفی یک حاشیه نویسی @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برای تعیین مقدار بازگشتی می تواند گیج کننده باشد. زبان جاوا همچنین به شما امکان می دهد از breakcontinue) با برچسبی مانند عملگر پرش بدون قید و شرط استفاده کنید 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.0 java.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
مطالب بر اساس مقاله ای از سایمون ریتر و اسناد رسمی است .
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION