JavaRush /وبلاگ جاوا /Random-FA /جاوا 14: چه چیزی جدید است؟

جاوا 14: چه چیزی جدید است؟

در گروه منتشر شد
مشکلات دنیا مشکلات دنیاست و جاوا جدید طبق برنامه است. یعنی دقیقا هر شش ماه یکبار. نسخه منتشر شده جاوا 14 در 17 مارس منتشر شد و چندین نوآوری جالب را برای توسعه دهندگان به زبان معرفی کرد. جاوا 14: چه چیزی جدید است؟  - 1از جمله پشتیبانی آزمایشی برای کلمه کلیدی رکورد ، پشتیبانی از تطبیق الگو در عملگر " instanceof "، NullPointerExceptions کاربرپسندتر ، "پیش نمایش" گسترده بلوک های متنی ، یک سوئیچ پیش فرض به روز شده، و موارد دیگر. به شما یادآوری می کنیم که همه نوآوری ها در جاوا با پیشنهادهای توسعه ( JEP، Java Enhancement Proposals ) شروع می شوند. توسعه دهندگان تغییراتی را پیشنهاد می کنند، آنها توسط والدین "رسمی" جاوا بررسی می شوند و سپس برخی از آن تغییرات پذیرفته می شوند و پس از آن بخشی از JDK می شوند. و اکنون - در مورد همه چیز به ترتیب.

JEP 359: رکوردها

رکوردها که با نام Records نیز شناخته می شوند، برای JDK 14 در حالت پیش نمایش در دسترس هستند و این چیزی کاملاً جدید برای جاوا است. در واقع، ما یک نوع جدید داریم که در طول پروژه Valhalla توسعه یافته است . رکوردها شبیه به شمارش هستند و به شما امکان می دهند کد خود را ساده کنید. اساساً آنها جایگزین کلاس هایی می شوند که حالت دارند اما رفتار ندارند. به عبارت ساده، فیلدهایی وجود دارد، هیچ روشی وجود ندارد. در مورد کلاس‌ها، گاهی اوقات مجبور می‌شویم کدهای تکراری زیادی بنویسیم که همیشه لازم نیست: سازنده‌ها، دسترسی‌ها، برابر ()، hashCode()، toString() و غیره. برای جلوگیری از این کدهای تکراری، جاوا برنامه‌ریزی می‌کند. برای استفاده از رکورد در اینجا نسخه کلاسیک است:
final class Triangle {
 	public final int x;
public final int y;
public final int z;

    public Triangle(int x, int y, int z) {
         this.x = x;
         this.y = y;
    this.z = z;
    }
    // equals, hashCode, toString
بیایید به جاوا 14 برویم و از رکورد استفاده کنیم:
public record Triangle(int x, int y, int z){}
همین. لطفاً توجه داشته باشید که ضبط‌ها در حال حاضر به صورت پیش‌نمایش وجود دارند، بنابراین برای آزمایش آنها در عمل باید jdk14 را دانلود کرده و دستور را وارد کنید:
javac —enable-preview —release 14 Triangle.java
رکوردها کلاس هستند، البته با محدودیت. آنها نمی توانند کلاس های دیگر را گسترش دهند یا فیلدها را اعلام کنند (به جز خصوصی نهایی که با اجزای اعلان حالت مطابقت دارند). سوابق به طور ضمنی نهایی هستند و نمی توانند انتزاعی باشند. رکوردها با کلاس های معمولی تفاوت دارند زیرا نمی توانند API خود را از نمایش آن جدا کنند. اما از دست دادن آزادی با افزایش دقت جبران می شود. اجزای رکورد نیز به طور ضمنی نهایی هستند.

JEP 305: تطبیق الگو برای نمونه (پیش نمایش)

ویژگی تطبیق الگو ، که در جاوا 14 در پیش نمایش معرفی شده است، برای ترکیب بررسی نوع یک شی و تبدیل آن در عملگر نمونه طراحی شده است. به عبارت دیگر، قبل از جاوا 14، برای مثال، کد زیر وجود داشت:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
همانطور که می بینید، باید شی را به کلاسی که متدهای آن می خواهیم استفاده کنیم، ارسال کنیم. اکنون جاوا 14 و ویژگی تطبیق الگوی متصل به شما امکان می دهد کد را به موارد زیر کاهش دهید:
Object object = Violin;

if (object instanceof Instrument instrument){
    System.out.println(instrument.getMaster());
}

JEP 343: ابزار بسته بندی (انکوباتور)

JDK 8 دارای ابزار javapackager بود که برای JavaFX طراحی شده بود. با این حال، پس از جدا شدن JavaFX از جاوا با انتشار JDK 11، جاوا بسته بندی محبوب دیگر در دسترس نبود. Javapackager یک ابزار بسته بندی بود. این اجازه می دهد تا برنامه های جاوا به گونه ای بسته بندی شوند که بتوانند مانند سایر برنامه های "عادی" نصب شوند. به عنوان مثال، فایل های exe را برای کاربران ویندوز ایجاد کنید و یک برنامه جاوا را مانند یک انسان راه اندازی کنید - با دو کلیک. البته، چنین ابزاری به شدت کم است، بنابراین JEP 343 ابزار جدیدی به نام jpackage را معرفی کرد که یک برنامه جاوا را در یک بسته مخصوص پلتفرم حاوی تمام وابستگی های لازم بسته بندی می کند. فرمت های بسته پشتیبانی شده برای یک پلت فرم خاص:
  • لینوکس: deb و rpm
  • macOS: pkg و dmg
  • ویندوز: MSI و EXE

JEP 345: NUMA-Aware Memory Allocation برای G1

JEP 345 صرفاً برای اجرای پشتیبانی NUMA (دسترسی به حافظه غیر یکنواخت) خدمت می کند. اینها معماری های دسترسی به حافظه ناهمگن هستند، راهی برای راه اندازی یک خوشه ریزپردازنده در یک سیستم چند پردازنده ای که در آن حافظه می تواند به صورت محلی توزیع شود: هر هسته پردازنده مقدار کمی حافظه محلی دریافت می کند، در حالی که هسته های دیگر به آن دسترسی دارند. JEP 345 قصد دارد جمع‌آوری زباله G1 را به توانایی استفاده از چنین معماری‌هایی مجهز کند. از جمله، این رویکرد به بهبود عملکرد در ماشین‌های بسیار قدرتمند کمک می‌کند.

JEP 349: JFR Event Streaming

Java Flight Recorder (JFR) اکنون بخشی از OpenJDK است و بنابراین به صورت رایگان در دسترس است. JDK 14 یک API برای ردیابی در حین پرواز رویدادهای JFR (ضبط کننده پرواز JDK)، به ویژه برای سازماندهی نظارت مستمر برنامه های فعال و غیرفعال اضافه می کند. رویدادهای مشابه با گزینه غیر جریانی، با سربار کمتر از 1٪ ثبت می شود. به این ترتیب رویدادها همزمان با گزینه غیر جریانی پخش می شوند. با این حال، JEP 349 نباید اجازه تماس همزمان برای مصرف کننده مربوطه را بدهد. حتی داده های سوابق ذخیره شده در حافظه میانی نیز نباید قابل دسترسی باشند. از نظر فنی، بسته jdk.jfr.consumer در ماژول jdk.jfr با قابلیت دسترسی ناهمزمان به رویدادها گسترش خواهد یافت.

JEP 352: بافرهای بایت نقشه برداری غیر فرار

همانطور که می دانید Java NIO (New IO) File API از JDK 1.4 وجود داشته است و پس از آن بهبود جدیدی به نام Path معرفی شد. Path یک رابط است که جایگزین کلاس java.io.File به عنوان نمایشی از یک فایل یا دایرکتوری می شود که در Java NIO کار می کنیم. JEP 352 MappedByteBuffer را گسترش می دهد تا بخشی از داده های فایل را در حافظه غیر فرار (NVM) بارگذاری کند. این حافظه رایانه که در آن اطلاعات حتی در صورت قطع برق (که اغلب به آن حافظه فقط خواندنی می گویند) از بین نمی رود، برای ذخیره دائمی داده ها استفاده می شود. این پیشنهاد بهبود جاوا ماژول و کلاس جدیدی را برای JDK API ارائه می‌کند: ماژول jdk.nio.mapmode، که حالت‌های جدید (READ_ONLY_SYNC، WRITE_ONLY_SYNC) را برای ایجاد بافرهای بایت نقشه‌برداری شده (MappedByteBuffer) ارجاع NVM ارائه می‌دهد.

JEP 358: NullPointerExceptions مفید

NullPointerExceptions اکنون بیشتر برنامه نویس پسند خواهد بود. به این معنا که شرح استثنا بسیار آموزنده تر از قبل خواهد بود. این به این دلیل است که به JVM آموزش داده شده است که دستورالعمل های بایت کد برنامه را با دقت بیشتری تجزیه و تحلیل کند، و می تواند نشان دهد که کدام متغیر به یک مقدار صفر منجر می شود. بیایید بگوییم که کد را داریم:
a.getMessage().getUserInfo().getName()
در هر یک از جدیدترین جاوا، گزارش خطای معمولی را دریافت خواهیم کرد، که به این سؤال پاسخ نمی دهد که دقیقاً چه کسی تهی است:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
و اگر بخواهید این ویژگی پیش‌نمایش را امتحان کنید، جاوا 14 به شما چه می‌دهد:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "UserInfo().getName()" because the return value of "Message().getUserInfo()" is null
	at Main.main(Main.java:12)
این زنجیره بسیار قابل درک‌تر است و به شما امکان می‌دهد با سرعت بیشتری با خطا مقابله کنید.

JEP 361: عبارات سوئیچ (استاندارد)

اپراتور سوئیچ به روز شده در جاوا 12 و 13 قبلی موجود بود، اما فقط به عنوان یک ویژگی پیش نمایش، یعنی به طور پیش فرض فعال نبود. اکنون در JDK 14 همه چیز خارج از جعبه کار می کند. جاوا 14 شکل ساده شده جدیدی از بلوک سوئیچ را با برچسب های مورد L -> ... معرفی می کند. فرم جدید در برخی موارد کد را ساده می کند. در اینجا چند نمونه آورده شده است. فرض کنید یک شماره داریم که روزهای هفته را توصیف می کند. ما می توانیم کد کلاسیک (قبل از جاوا 14) بنویسیم:
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
و در اینجا یک گزینه با استفاده از جاوا 14 وجود دارد:
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
همچنین می‌توانید بلوک‌های چند خطی بنویسید و یک مقدار را با کلمه کلیدی بازده جدید برگردانید:
int result = switch (s) {
    case "Working from Home" -> 1;
    case "Working from Office" -> 2;
    default    -> {
        System.out.println("Neither Home nor Office… Cafe? Car? Park?...");
        yield 0;
    }
};
هنگام استفاده از سوئیچ های جدید باید چند نکته مهم را در نظر داشته باشید . به ویژه، باید به یاد داشته باشید که گزینه ها باید جامع باشند. یعنی برای تمام مقادیر ممکن باید یک برچسب سوئیچ مربوطه وجود داشته باشد. از آنجایی که yield اکنون یک کلمه کلیدی است، کلاسی به نام yield در جاوا 14 امکان پذیر است. به طور کلی، اگر می خواهید نحوه استفاده از سوئیچ های به روز شده را یاد بگیرید، به JEP 361 بروید و مطالعه کنید. اطلاعات جالب زیادی در آنجا وجود دارد.

JEP 362: پورت های Solaris و SPARC را منسوخ کنید

بعید است که بسیاری از خوانندگان ما در مورد سیستم عامل Solaris به یاد داشته باشند . این سیستم عامل مبتنی بر یونیکس که توسط والدین جاوا، Sun Microsystems ایجاد شده است، عمدتاً برای سرورهای معماری SPARC استفاده می‌شود... تعداد کلمات ناآشنا در هر سانتی‌متر مربع بسیار زیاد است؟ چیز مهمی نیست: JEP 362 به پشتیبانی از پلتفرم های Solaris/SPARC، Solaris/x64 و Linux/SPARC پایان می دهد. یعنی پورت های آنها در حال حاضر منسوخ شده است و در آینده به احتمال زیاد از OpenJDK حذف خواهند شد. با این حال، نسخه های قدیمی جاوا (قبل از JDK 14) در مورد پورت های Solaris/SPARC، Solaris/x64 و Linux/SPARC باید بدون تغییر کار کنند. اگر اهل تاریخ هستید و به فناوری های گذشته نه چندان دور علاقه دارید، به ویکی پدیا بروید و در مورد معماری SPARС مطالعه کنید .

JEP 363: جمع‌آوری زباله علامت‌گذاری همزمان (CMS) را حذف کنید

جمع‌آوری زباله CMS (Concurrent Mark Sweep) هدف حذف قرار گرفته است زیرا دو سال پیش به‌عنوان منسوخ علامت‌گذاری شد و نگهداری نشد. با این حال، کاربران نسخه های قدیمی جاوا با استفاده از CMS GC می توانند بازدم کنند - هدف این JEP حذف سازنده از نسخه های قبلی JDK نیست. علاوه بر این، ترکیب الگوریتم‌های جمع‌آوری زباله ParallelScavenge و SerialOld (که با گزینه‌های "-XX:+UseParallelGC -XX:-UseParallelOldGC" اجرا می‌شوند) منسوخ شده است.

JEP 364: ZGC در macOS و JEP 365: ZGC در ویندوز

یک زباله جمع کن جالب به نام Z Garbage Collector (ZGC) وجود دارد . در حالت غیرفعال کار می کند و سعی می کند تاخیرهای ناشی از جمع آوری زباله را به حداقل برساند: زمان توقف هنگام استفاده از ZGC از 10 میلی ثانیه تجاوز نمی کند. می تواند با توده های کوچک و غول پیکر (آنهایی که ترابایت های زیادی را اشغال می کنند) کار کند. JEP 364 و JEP 365 عملا دوقلو هستند. JEP 364 Z Garbage Collector را به MacOS می آورد. بخشی از JEP همچنین عملکرد جمع‌آوری را برای آزاد کردن حافظه دستگاه بدون استفاده توضیح می‌دهد، همانطور که در JEP 351 مشخص شده است ، این از زمان جاوا 13 اتفاق افتاده است. پیاده‌سازی ZGC در macOS دارای دو بخش است:
  • پشتیبانی از حافظه چند نقشه در macOS
  • پشتیبانی از ZGC برای رزرو مداوم حافظه
JEP 365 از ZGC در حال حاضر در ویندوز و همچنین در حالت آزمایشی پشتیبانی می کند. به شرح زیر است:
  • پشتیبانی از چند نقشه برداری حافظه
  • پشتیبانی از نگاشت حافظه بر اساس فایل صفحه در فضای آدرس رزرو شده
  • پشتیبانی از نقشه برداری و برداشتن نقشه قسمت های دلخواه پشته
  • پشتیبانی از ارتکاب و عدم تعهد بخش های دلخواه پشته

JEP 366: منسوخ کردن ترکیب ParallelScavenge + SerialOld GC

این JEP ترکیب الگوریتم‌های جمع‌آوری زباله موازی و Serial Old را منسوخ می‌کند. این ترکیب باید به صورت دستی با استفاده از پارامترهای خط فرمان -XX: + UseParallelGC -XX: -UseParallelOldGC فعال می شد. نویسندگان بر این باورند که این ترکیب بسیار خاص است، اما نیاز به تلاش قابل توجهی برای تعمیر و نگهداری دارد. بنابراین اکنون گزینه -XX: UseParallelOldGC منسوخ شده است و در صورت استفاده یک هشدار ظاهر می شود.

JEP 367: Pack200 Tools و API را حذف کنید

Pack200 یک فرمت آرشیو است که برای ذخیره فایل های کلاس جاوا کامپایل شده بهینه شده است. این ابزار از زمان جاوا 11 منسوخ شده است. اکنون ابزارهای pack200، unpack200 و Pack200 API رسما برای حذف از بسته java.util.jar اعلام شده اند . این فناوری در جاوا 5 به عنوان ابزاری برای مقابله با پهنای باند بسیار محدود (مودم ها، ترسناک است که بگوییم و به خاطر بسپاریم، 56k) و فضای ذخیره سازی ناکافی روی هارد دیسک ها معرفی شد. چند وقت پیش، جاوا 9 طرح های فشرده سازی جدیدی را معرفی کرد. توسعه دهندگان تشویق می شوند از jlink استفاده کنند .

JEP 368: بلوک های متن (پیش نمایش دوم)

بلوک‌های متنی اولین بار در جاوا 13 ظاهر شدند. این بلوک‌های رشته‌ای چندخطی هستند که از نیاز به بیشتر توالی‌های فرار جلوگیری می‌کنند، به طور خودکار رشته را قالب‌بندی می‌کنند و همچنین به توسعه‌دهنده اجازه می‌دهند در صورت لزوم رشته را قالب‌بندی کند. این ویژگی مفید اکنون در جاوا 14 (پیش نمایش دوم) موجود است. هدف اصلی بلوک های متنی بهبود مدیریت حروف چند خطی گیج کننده است. این کار خواندن و نوشتن پرس و جوهای SQL، کدهای HTML و XML و JSON را بسیار ساده می کند. مثال HTML بدون بلوک های متنی:
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, JavaRush Student</p>\n" +
              "    </body>\n" +
              "</html>\n";
چگونه می توان همان را با بلوک های متنی نشان داد:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
جداکننده آغازین دنباله ای از سه کاراکتر نقل قول دوگانه (""") است که با فاصله صفر یا بیشتر و سپس یک جداکننده خط. محتوا از اولین کاراکتر بعد از جداکننده خط جداکننده ابتدایی شروع می شود . دنباله ای از سه کاراکتر نقل قول دوگانه " _ ) انتخاب شد تا کاراکترها بدون فرار نمایش داده شوند و همچنین بصری یک بلوک متن را از یک رشته واقعی متمایز کند. در اوایل سال 2019، JEP 355 بلوک‌های متنی را به عنوان ادامه‌ی JEP 326 (حرف‌های رشته‌ای خام) پیشنهاد کرد، اما آنها حذف شدند. در اواخر همان سال، JDK 13 ویژگی پیش‌نمایش بلوک متن را معرفی کرد و اکنون جاوا 14 دو دنباله فرار جدید را اضافه کرده است. این یک خط پایان‌دهنده است که نشان داده می‌شود \، و دومی برای فضای منفرد است که نشان‌دهنده /s است. نمونه ای از استفاده از خطوط جدید بدون بلوک های متنی:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
و اکنون با دنباله فرار \<line-terminator>:
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
دنباله فرار \s برای محاسبه فضای خالی انتهایی استفاده می شود که به طور پیش فرض توسط کامپایلر نادیده گرفته می شود. تمام فضای خالی قبل از آن را حفظ می کند. مثال:
String text1 = """
               line1
               line2 \s
               line3
               """;

String text2 = "line1\nline2 \nline3\n";
text1و text2یکسان هستند.

JEP 370: API دسترسی به حافظه خارجی (انکوباتور)

بسیاری از کتابخانه ها و برنامه های محبوب جاوا به حافظه خارجی دسترسی دارند. به عنوان مثال، Ignite، MapDB، Memcached و Netty ByteBuf API. با انجام این کار، آنها می توانند از هزینه و غیرقابل پیش بینی بودن مربوط به جمع آوری زباله جلوگیری کنند (مخصوصاً در هنگام سرویس دهی کش های بزرگ)، حافظه را در چندین فرآیند به اشتراک بگذارند، و با نگاشت فایل ها در حافظه (مثلاً با استفاده از mmap) محتوای حافظه را سریالی و غیر سریالی کنند. با این حال، Java API هنوز راه حل مناسبی برای دسترسی به حافظه خارجی ندارد. JDK 14 شامل پیش نمایشی از Foreign-Memory Access API است که به برنامه های جاوا اجازه می دهد با استفاده از انتزاعات MemorySegment، MemoryAddress و MemoryLayout جدید، به طور ایمن و کارآمد به مناطق حافظه خارج از پشته JVM دسترسی پیدا کنند.

نتیجه گیری

خب چی فکر می کنی؟ در مقایسه با جاوا 13، جاوا 14 جدید پیشرفت های مهم تری را در زمینه های مختلف ارائه می دهد. به احتمال زیاد، مهمترین مورد برای توسعه دهندگان سوئیچ به روز شده، استثناهای توسعه یافته NullPointerExceptions و رکوردها خواهد بود. یا نه؟.. فراموش نکنید که ویژگی های جدید جاوا 14 را امتحان کنید، حتی برای مبتدیان نیز بسیار مفید است. در تحصیلاتت موفق باشی
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION