JavaRush /مدونة جافا /Random-AR /جافا 14: ما الجديد؟

جافا 14: ما الجديد؟

نشرت في المجموعة
مشاكل العالم هي مشاكل العالم، وجافا الجديدة في الموعد المحدد. أي مرة واحدة كل ستة أشهر بالضبط. تم إصدار نسخة الإصدار من Java 14 في 17 مارس، وقدمت العديد من الابتكارات المثيرة للاهتمام للغة التي تستهدف المطورين. جافا 14: ما الجديد؟  - 1من بينها الدعم التجريبي للكلمة الأساسية للتسجيل ، ودعم مطابقة الأنماط في عامل التشغيل " مثيل "، واستثناءات NullPointerExceptions الأكثر سهولة في الاستخدام ، و"المعاينة" الموسعة للكتل النصية ، ومفتاح افتراضي محدث، وغير ذلك الكثير. دعونا نذكرك أن جميع الابتكارات في Java تبدأ بمقترحات الامتداد ( JEP، Java Enhancement Proposals ). يقترح المطورون تغييرات، وتتم مراجعتها من قبل آباء Java "الرسميين"، ثم يتم قبول بعض هذه التغييرات، وبعد ذلك تصبح جزءًا من JDK. والآن - كل شيء على ما يرام.

جيب 359: السجلات

السجلات، المعروفة أيضًا باسم السجلات، متاحة لـ JDK 14 في وضع المعاينة، وهذا شيء جديد تمامًا لـ Java. في الواقع، أمامنا نوع جديد تم تطويره خلال مشروع Valhalla . تشبه السجلات التعدادات وتسمح لك بتبسيط التعليمات البرمجية الخاصة بك. في الأساس، فإنها تحل محل الفئات التي لها حالة ولكن ليس لها سلوك. ببساطة، هناك حقول، ولا توجد طرق. في حالة الفئات، يتعين علينا أحيانًا كتابة الكثير من التعليمات البرمجية المتكررة التي ليست ضرورية دائمًا: المنشئات، والملحقات، و equals()، hashCode()، toString()، وما إلى ذلك. لتجنب هذه التعليمات البرمجية المتكررة، تخطط Java لاستخدام السجل. وهنا النسخة الكلاسيكية:
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
دعنا ننتقل إلى Java 14 ونستخدم السجل:
public record Triangle(int x, int y, int z){}
هذا كل شئ. يرجى ملاحظة أن التسجيلات موجودة حاليًا في نموذج المعاينة، لذا لتجربتها عمليًا، تحتاج إلى تنزيل jdk14 وإدخال الأمر:
javac —enable-preview —release 14 Triangle.java
السجلات هي فئات، وإن كان ذلك مع القيود. لا يمكنهم توسيع فئات أخرى أو الإعلان عن الحقول (باستثناء النهائي الخاص الذي يتوافق مع مكونات إعلان الحالة). السجلات نهائية ضمنيًا ولا يمكن أن تكون مجردة. تختلف السجلات عن الفئات العادية من حيث أنها لا تستطيع فصل واجهة برمجة التطبيقات (API) الخاصة بها عن تمثيلها. لكن فقدان الحرية يتم تعويضه بزيادة الدقة. مكونات السجل هي أيضًا نهائية ضمنيًا.

JEP 305: مطابقة الأنماط على سبيل المثال (معاينة)

تم تصميم ميزة مطابقة الأنماط ، المقدمة في Java 14 في المعاينة، للجمع بين التحقق من نوع الكائن وتحويله في مثيل عامل التشغيل. بمعنى آخر، قبل Java 14 كان من الممكن أن يكون هناك، على سبيل المثال، الكود التالي:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
كما ترون، يجب علينا إرسال الكائن إلى الفئة التي نريد استخدام أساليبها. الآن يتيح لك Java 14 وميزة مطابقة الأنماط المتصلة تقليل التعليمات البرمجية إلى ما يلي:
Object object = Violin;

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

JEP 343: أداة التغليف (الحاضنة)

يحتوي JDK 8 على أداة javapackager مصممة لـ JavaFX. ومع ذلك، بعد فصل JavaFX عن Java مع إصدار JDK 11، لم يعد javapackager الشهير متاحًا. كانت Javapackager أداة تغليف. لقد سمح بتجميع تطبيقات Java بطريقة يمكن تثبيتها مثل جميع البرامج "العادية" الأخرى. على سبيل المثال، قم بإنشاء ملفات exe لمستخدمي Windows وتشغيل تطبيق Java مثل الإنسان - بنقرة مزدوجة. بالطبع، هناك نقص شديد في مثل هذه الأداة، لذلك قدم JEP 343 أداة جديدة، jpackage ، والتي تعمل على حزم تطبيق Java في حزمة خاصة بالنظام الأساسي تحتوي على جميع التبعيات الضرورية. تنسيقات الحزم المدعومة لمنصة معينة:
  • لينكس: ديب و دورة في الدقيقة
  • نظام التشغيل MacOS: pkg وdmg
  • ويندوز: MSI و EXE

JEP 345: تخصيص الذاكرة المدرك لـ NUMA لـ G1

يعمل JEP 345 فقط على تنفيذ دعم NUMA (الوصول غير الموحد للذاكرة). هذه هي بنيات الوصول إلى الذاكرة غير المتجانسة، وهي طريقة لإعداد مجموعة المعالجات الدقيقة في نظام متعدد المعالجات حيث يمكن توزيع الذاكرة محليًا: يحصل كل نواة معالج على كمية صغيرة من الذاكرة المحلية، بينما تتمتع النوى الأخرى بإمكانية الوصول إليها. يخطط JEP 345 لتزويد مجمع البيانات المهملة G1 بالقدرة على الاستفادة من هذه البنى. ومن بين أمور أخرى، يساعد هذا الأسلوب على تحسين الأداء على الأجهزة القوية جدًا.

JEP 349: تدفق الأحداث JFR

أصبح Java Flight Recorder (JFR) الآن جزءًا من OpenJDK وبالتالي فهو متاح مجانًا. يضيف JDK 14 واجهة برمجة تطبيقات للتتبع الفوري لأحداث JFR (JDK Flight Recorder)، خاصة لتنظيم المراقبة المستمرة للتطبيقات النشطة وغير النشطة. يتم تسجيل نفس الأحداث بالنسبة لخيار عدم البث، مع نسبة حمل أقل من 1%. بهذه الطريقة سيتم بث الأحداث في نفس الوقت الذي يتم فيه بث خيار عدم البث. ومع ذلك، يجب ألا يسمح JEP 349 بعمليات الاسترجاعات المتزامنة للمستهلك المقابل. حتى البيانات من السجلات المخزنة في الذاكرة المتوسطة لا ينبغي الوصول إليها. من الناحية الفنية، سيتم توسيع الحزمة jdk.jfr.consumer في الوحدة jdk.jfr بوظيفة الوصول غير المتزامن إلى الأحداث.

JEP 352: مخازن البايت المؤقتة المعينة غير المتطايرة

كما تعلم، كانت Java NIO (New IO) File API موجودة منذ JDK 1.4، ثم تم تقديم تحسين جديد يسمى Path. المسار عبارة عن واجهة تحل محل فئة java.io.File كتمثيل لملف أو دليل عندما نعمل في Java NIO. يقوم JEP 352 بتوسيع MappedByteBuffer لتحميل جزء من بيانات الملف إلى الذاكرة غير المتطايرة (NVM). تُستخدم ذاكرة الكمبيوتر هذه، والتي لن يتم فقدان البيانات فيها حتى في حالة إيقاف تشغيل الطاقة (تسمى غالبًا ذاكرة القراءة فقط)، لتخزين البيانات بشكل دائم. يوفر مقترح تحسين Java هذا وحدة نمطية وفئة جديدة لواجهة برمجة تطبيقات JDK: وحدة jdk.nio.mapmode، التي توفر أوضاعًا جديدة (READ_ONLY_SYNC، WRITE_ONLY_SYNC) لإنشاء مخازن بايت معينة (MappedByteBuffer) تشير إلى NVM.

JEP 358: استثناءات NullPointerExceptions مفيدة

ستصبح NullPointerExceptions الآن أكثر ملاءمة للمبرمجين. بمعنى أن وصف الاستثناء سيكون أكثر إفادة من ذي قبل. وذلك لأن JVM قد تم تعليمه كيفية تحليل تعليمات الكود الثانوي للبرنامج بشكل أكثر دقة، ويمكنه الإشارة إلى المتغير الذي يؤدي إلى قيمة صفر. لنفترض أن لدينا الكود:
a.getMessage().getUserInfo().getName()
في أي من أحدث إصدارات Java، سنحصل على سجل الأخطاء المعتاد، والذي لا يجيب على سؤال من هو بالضبط فارغ:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
وإليك ما ستقدمه لك Java 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: تبديل التعبيرات (قياسي)

كان مشغل Switch المحدث متاحًا في الإصدارين السابقين من Java 12 و13، ولكن كميزة معاينة فقط، أي أنه لم يتم تمكينه افتراضيًا. الآن في JDK 14، كل شيء يعمل خارج الصندوق. يقدم Java 14 نموذجًا مبسطًا جديدًا لكتلة التبديل مع تسميات الحالة L -> ...، ويعمل النموذج الجديد على تبسيط التعليمات البرمجية في بعض الحالات. هنا بضعة أمثلة. لنفترض أن لدينا تعدادًا يصف أيام الأسبوع. يمكننا كتابة الكود الكلاسيكي (ما قبل Java 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;
}
وإليك خيارًا باستخدام Java 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;
    }
};
هناك بعض الأشياء الأكثر أهمية التي يجب وضعها في الاعتبار عند استخدام المحولات الجديدة . وعلى وجه الخصوص، عليك أن تتذكر أن الخيارات يجب أن تكون شاملة. وهذا هو، لجميع القيم الممكنة يجب أن يكون هناك تسمية التبديل المقابلة. نظرًا لأن "العائد" أصبح الآن كلمة رئيسية، فمن الممكن وجود فئة تسمى "العائد" في Java 14. بشكل عام، إذا كنت تريد معرفة كيفية استخدام المفاتيح المحدثة، فانتقل إلى JEP 361 وادرس. هناك الكثير من المعلومات المثيرة للاهتمام هناك.

JEP 362: إهمال منافذ Solaris وSPARC

من غير المرجح أن يتذكر العديد من قرائنا نظام التشغيل Solaris . تم استخدام نظام التشغيل المستند إلى UNIX، والذي أنشأته شركة Sun Microsystems، الشركة الأم لـ Java، في المقام الأول للخوادم الموجودة على بنية SPARC... هناك عدد كبير جدًا من الكلمات غير المألوفة لكل سنتيمتر مربع؟ ليست مشكلة كبيرة: ينهي JEP 362 دعم الأنظمة الأساسية Solaris/SPARC، وSolaris/x64، وLinux/SPARC. أي أن منافذها أصبحت الآن مهملة، ومن المرجح أن تتم إزالتها في المستقبل من OpenJDK. ومع ذلك، يجب أن تعمل الإصدارات الأقدم من Java (قبل JDK 14) فيما يتعلق بمنافذ Solaris/SPARC، وSolaris/x64، وLinux/SPARC دون تعديل. إذا كنت من هواة التاريخ ومهتمًا بتقنيات الماضي غير البعيد، فانتقل إلى ويكيبيديا واقرأ عن بنية SPARС .

JEP 363: إزالة أداة تجميع البيانات المهملة لمسح العلامات المتزامنة (CMS).

تم استهداف أداة تجميع البيانات المهملة CMS (Concurrent Mark Sweep) للإزالة لأنه تم وضع علامة عليها منذ عامين على أنها قديمة وتركت دون صيانة. ومع ذلك، يمكن لمستخدمي الإصدارات الأقدم من Java الذين يستخدمون CMS GC الزفير - والغرض من JEP هذا ليس إزالة المنشئ من إصدارات JDK السابقة. بالإضافة إلى ذلك، تم إهمال مجموعة من خوارزميات تجميع البيانات المهملة ParallelScavenge وSerialOld (التي تعمل مع خيارات "-XX:+UseParallelGC -XX:-UseParallelOldGC").

JEP 364: ZGC على نظام التشغيل macOS و JEP 365: ZGC على نظام Windows

يوجد جامع قمامة مثير للاهتمام يسمى Z Garbage Collector (ZGC) . إنه يعمل في الوضع السلبي ويحاول تقليل التأخير الناتج عن جمع البيانات المهملة: لا يتجاوز وقت التوقف عند استخدام ZGC 10 مللي ثانية. يمكنه العمل مع أكوام صغيرة وأكوام عملاقة (تلك التي تستهلك الكثير من التيرابايت). JEP 364 وJEP 365 هما توأمان عمليًا. JEP 364 يجلب Z Garbage Collector إلى نظام التشغيل MacOS. يصف جزء من JEP أيضًا وظيفة المجمع لتحرير ذاكرة الجهاز غير المستخدمة، كما هو محدد في JEP 351 ، ويحدث هذا مع Java 13. يتكون تطبيق ZGC على نظام التشغيل macOS من جزأين:
  • دعم ذاكرة التعيين المتعدد على نظام التشغيل macOS
  • دعم ZGC لحجز الذاكرة المستمر
يوفر JEP 365 الدعم لـ ZGC الموجودة بالفعل على نظام التشغيل Windows، وكذلك في الوضع التجريبي. وهي كالاتي:
  • دعم الذاكرة متعددة الخرائط
  • دعم تعيين الذاكرة استنادًا إلى ملف الصفحة في مساحة عنوان محجوزة
  • دعم لرسم الخرائط وإلغاء تعيين أجزاء عشوائية من الكومة
  • دعم الالتزام وعدم الالتزام بالأجزاء التعسفية من الكومة

JEP 366: إهمال تركيبة ParallelScavenge + SerialOld GC

يتجاهل JEP هذا الجمع بين خوارزميات تجميع البيانات المهملة Parallel Scavenge وSerial Old. يجب تمكين هذه المجموعة يدويًا باستخدام معلمات سطر الأوامر -XX: + UseParallelGC -XX: -UseParallelOldGC. يعتقد المؤلفون أن التركيبة محددة جدًا، ولكنها تتطلب أيضًا جهدًا كبيرًا للصيانة. والآن تم إهمال الخيار -XX: UseParallelOldGC وسيظهر تحذير في حالة استخدامه.

JEP 367: إزالة أدوات Pack200 وواجهة برمجة التطبيقات (API).

Pack200 هو تنسيق أرشيف مُحسّن لتخزين ملفات فئة Java المجمعة. تم وضع علامة على هذه الأداة باعتبارها مهملة منذ Java 11. والآن تم الإعلان رسميًا عن إزالة أدوات pack200 وunpack200 وPack200 API من الحزمة java.util.jar . تم تقديم هذه التقنية مرة أخرى في Java 5 كوسيلة للتعامل مع النطاق الترددي المحدود للغاية (أجهزة المودم، من المخيف أن نقول ونتذكر، 56 كيلو بايت) ومساحة التخزين غير الكافية على محركات الأقراص الثابتة. منذ بعض الوقت، قدمت Java 9 أنظمة ضغط جديدة. يتم تشجيع المطورين على استخدام jlink .

JEP 368: كتل النص (المعاينة الثانية)

ظهرت الكتل النصية لأول مرة في Java 13. وهي عبارة عن سلاسل حرفية متعددة الأسطر تمنع الحاجة إلى معظم تسلسلات الهروب، وتقوم بتنسيق السلسلة تلقائيًا، وتسمح أيضًا للمطور بتنسيق السلسلة إذا لزم الأمر. هذه الميزة المفيدة متاحة الآن في Java 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 ميزة معاينة كتلة النص، والآن أضاف Java 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: واجهة برمجة التطبيقات للوصول إلى الذاكرة الخارجية (الحاضنة)

تتمتع العديد من مكتبات وبرامج Java الشائعة بإمكانية الوصول إلى الذاكرة الخارجية. على سبيل المثال، Ignite وMapDB وMemcached وNetty ByteBuf API. ومن خلال القيام بذلك، يمكنهم تجنب التكلفة وعدم القدرة على التنبؤ المرتبطة بجمع البيانات المهملة (خاصة عند تقديم ذاكرات تخزين مؤقت كبيرة)، ومشاركة الذاكرة عبر عمليات متعددة، وإجراء تسلسل وإلغاء تسلسل محتويات الذاكرة عن طريق تعيين الملفات في الذاكرة (على سبيل المثال، باستخدام mmap). ومع ذلك، لا يزال Java API لا يحتوي على حل مناسب للوصول إلى الذاكرة الخارجية. يتضمن JDK 14 معاينة لواجهة برمجة تطبيقات الوصول إلى الذاكرة الخارجية ، والتي تسمح لتطبيقات Java بالوصول بشكل آمن وفعال إلى مناطق الذاكرة خارج كومة JVM باستخدام تجريدات MemorySegment وMemoryAddress وMemoryLayout الجديدة.

الاستنتاجات

فما رأيك؟ بالمقارنة مع Java 13، يقدم Java 14 الجديد العديد من التحسينات الأكثر أهمية في مجموعة متنوعة من المجالات. على الأرجح، سيكون الأهم بالنسبة للمطورين هو التبديل المحدث والاستثناءات الممتدة NullPointerExceptions والسجلات. أم لا؟.. لا تنس تجربة الميزات الجديدة في Java 14، فهي مفيدة جدًا حتى للمبتدئين. حظا موفقا في دراستك!
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION