ما الجديد في Java 17؟

نشرت: 2021-10-05

تم إطلاق إصدار الدعم طويل الأجل (LTS) من منصة Java 17 للغة ووقت التشغيل في 14 سبتمبر 2021. دعنا نتعرف على الجديد في Java 17 وما إذا كان يجب عليك الترقية.

تستخدم العديد من التطبيقات إصدارات أقدم من Java ، بما في ذلك إصدارات LTS السابقة من Java: Java 11 و Java 8.

لماذا يجب على الشركات الترقية إلى أحدث إصدار من Java؟ تتطلب الترقية إلى Java 17 جهدًا ، بشكل أساسي لتحقيق أقصى استفادة من الميزات والوظائف الجديدة داخل JVM.

تستخدم العديد من الشركات صور Docker و Docker للتبديل إلى Java 17 بسهولة بأقل جهد ووقت. يمكن للمطورين تحديد خطوط أنابيب التكامل / النشر المستمر (CI / CD) وتشغيل كل شيء في صور Docker. لن يؤثر ذلك على الفرق الأخرى التي تستخدم إصدارات Java القديمة ، حيث يمكنهم استخدام صور Docker القديمة.

ميزات جافا 17

دعم macOS و AArch64

تتمثل إحدى ميزات JVM المهمة المضافة إلى هذا الإصدار في تعزيز دعم macOS على بنية AArch64 باستخدام JEP 391. وستدعم أحدث سلسلة من المعالجات (M1) التي أصدرتها Apple مع أجهزة الكمبيوتر الخاصة بها في العام الماضي.

إنها ليست بالضرورة مشكلة كبيرة للمستخدمين على تلك الأنظمة الأساسية لأن بعض البائعين أطلقوا إصدارات من JDK تدعم هذه البنية وحتى تعيد الدعم من Java 8. ومع ذلك ، فإن الختم الرسمي للموافقة ضروري لضمان الصيانة والدعم المستقبليين لـ المنصة. بالمقارنة ، تمت إضافة دعم النظام الأساسي Linux / AArch64 إلى Java 9 و Windows / AArch64 في Java 16.

فئات مختومة

الفصول المختومة هي ميزة تم تقديمها في Java 17. أكملت ميزة الفئات المختومة مرحلتها التجريبية وأصبحت منصة ولغة رسمية في Java 17. وهي تسمح للمطور بتحديد الأنواع الفرعية المسموح بها التي يمكن أن يمتلكها النوع و منع الآخرين من مدها أو تنفيذها بطريقة غير مقصودة.

تسمح الفئات المختومة أيضًا للمترجم بإنشاء أخطاء في وقت الترجمة عندما تحاول تحويل نوع غير مختوم إلى نوع فرعي غير مسموح به. يوفر Java 17 أيضًا خط أنابيب عرض جديدًا لتطبيقات AWT / Swing التي تعمل على macOS باستخدام Apple Metal API بدلاً من OpenGL. يحتوي على واجهة برمجة تطبيقات محسّنة وميزات محسّنة لإنشاء أرقام عشوائية.

التغييرات والحذف والقيود في Java 17

يجلب Java 17 أيضًا العديد من التغييرات والحذف والقيود الجديدة.

تغليف JDK الداخلية

أحد التغييرات هو اختتام عملية تغليف JDK Internals. كانت المرة الأولى التي تم فيها تقديم هذا ضمن Java 9 وستعطي تحذيرات أثناء وقت التشغيل عندما يحاول المستخدم استخدام انعكاس أو ما شابه للتحايل على القيود المعتادة على استخدام واجهات برمجة التطبيقات الداخلية. تمت إضافة وسيطات سطر الأوامر أيضًا لتنظيم هذا السلوك.

من Java 9 ، تم إنشاء العديد من واجهات برمجة التطبيقات لتقديم طريقة موحدة للقيام بالمهام الأكثر استخدامًا ؛ قد يستخدم المستخدمون واجهات برمجة التطبيقات هذه داخليًا. مع Java 16 ، تم تغيير الإعداد الافتراضي من تحذير إلى تعطيل الوصول إلى طرح استثناء. ومع ذلك ، فإنه يستخدم وسيطة سطر الأوامر لتغيير السلوك.

باستخدام Java 17 ، يتم حذف وسيطة سطر الأوامر ، ومن الممكن إلغاء تنشيط هذا التقييد. هذا يعني أن جميع عمليات الوصول غير المصرح بها إلى واجهات برمجة التطبيقات الداخلية تلك محمية الآن.

دلالات النقطة العائمة الصارمة دائمًا

يمكن وصف "إزالة" إضافية بأنها إعادة تقديم دلالات النقطة العائمة دائمًا. أدخلت Java 1.2 تعديلات على دلالات الفاصلة العائمة الافتراضية في Java والتي تسمح لـ JVM بالتداول بقدر ضئيل من الدقة في حسابات الفاصلة العائمة لتحسين الأداء. في الفصول والطرق حيث يجب استخدام دلالات صارمة ، تمت إضافة كلمة أساسية strictfp . منذ ذلك الحين ، تم تقديم أنواع مختلفة من مجموعة التعليمات إلى وحدات المعالجة المركزية (CPU) ، مما يجعل استخدام دلالات الفاصلة العائمة الصارمة دون تكلفة غير ضرورية. تم التخلص من الحاجة إلى تنفيذ دلالات افتراضية أو صارمة.

تقوم Java 17 بإزالة الدلالات الافتراضية السابقة ، ويتم تنفيذ جميع عمليات الفاصلة العائمة بدقة. لا يزال مصطلح strictfp موجودًا. ومع ذلك ، ليس له أي تأثير ويسبب تحذيرًا في وقت الترجمة.

تجميع قبل الوقت (AOT)

قدم Java 9 التجميع المسبق (AOT) كميزة تجريبية تستخدم مترجم Graal ، وتم كتابة كود JIT باستخدام Java. جعل Java 10 مترجم Graal قابلاً للاستخدام كمترجم JIT في OpenJDK من خلال دمج واجهة JVMCI. منذ إصداره ، كان بمثابة تحسن كبير. شهد مترجم Graal تطورات هائلة ولديه JVM تحت اسم GraalVM.

تفعيل RMI

تم إلغاء تنشيط RMI في JEP 407 بعد إزالته من Java 8 وتم إهماله أخيرًا ووضع علامة عليه كشرط للإزالة داخل Java 15. قدم تنشيط RMI طريقة لتمكين موارد الكائنات الموزعة عند الطلب باستخدام RMI. ومع ذلك ، فقد شهدت استخدامًا ضئيلًا ، وهناك بديل أفضل متاح في الوقت الحاضر. لا يتأثر باقي RMI بإلغاء جزء التنشيط.

Applet API إزالة

تم تعيين Applet API أخيرًا للإزالة بواسطة JEP 398 ، تمت إزالته مبدئيًا داخل Java 9. قدمت Applet API طريقة لدمج عناصر تحكم Java AWT / Swing في صفحة ويب داخل متصفح. ومع ذلك ، لا يوجد متصفح حديث يمكنه دعم ذلك ، مما يعني أنه لم يكن من الممكن الوصول إلى التطبيقات الصغيرة بشكل أساسي خلال العقد الماضي أو نحو ذلك.

مدير الامن

أهم إهمال هو مدير الأمن (JEP 411). تم استخدام Security Manager لفترة من الوقت منذ Java 1.0. تم تصميمه لتقييد ما يمكن أن تفعله Java محليًا على الجهاز ، مثل تقييد الوصول إلى الشبكات والملفات وموارد الشبكة الأخرى. كما يحاول أيضًا وضع رمز الحماية غير الموثوق به عن طريق حظر الانعكاس وواجهات برمجة التطبيقات المحددة.

بدأت نهاية Security Manager في Java 12. تمت إضافة وسيطة سطر أوامر لمنع استخدام مدير الأمن في وقت التشغيل. التغيير الذي تم إجراؤه في Java 17 يعني أنه سيتم إنشاء تحذير وقت التشغيل في JVM عند محاولة تعيين Security Manager ، إما من سطر الأوامر أو ديناميكيًا في وقت التشغيل.

حاضنة وميزات المعاينة

تساءل الكثيرون عما إذا كان Java 17 سيحتوي على أي ميزات معاينة وحاضنة ، مع الأخذ في الاعتبار أنه تم ترقية Java 17 ليكون إصدارًا مدعومًا على المدى الطويل. تحتوي Java 17 على وحدتين حاضنة وميزة معاينة!

واجهة برمجة تطبيقات Vector

Vector API (JEP 414) حاليا في مرحلتها الثانية من الحاضنة. تسمح واجهة برمجة التطبيقات للمطورين بتعريف حساب المتجه الذي سيحوله مترجم JIT بعد ذلك إلى تعليمات المتجه المناسبة التي تدعمها بنية وحدة المعالجة المركزية التي يعمل عليها JVM (على سبيل المثال ، باستخدام مجموعات تعليمات SSE أو AVX).

قبل ذلك ، كان على المطورين استخدام وظائف عددية أو إنشاء مكتبات أصلية مخصصة للنظام الأساسي. يوفر تطبيق Vector API في Java أيضًا آلية احتياطية سلسة كانت معقدة في الإصدارات السابقة.

يُمكّن توحيد Vector API الفئات داخل JDK من استخدامها. يمكن تغيير أساليب Java Arrays mismatch () ليتم تشغيلها على Java بدلاً من ذلك ، مما يلغي الحاجة إلى صيانة وكتابة تطبيقات خاصة بأنظمة أساسية متعددة داخل JVM.

وظيفة خارجية وذاكرة API

هناك ميزة إضافية للحاضنة تسمى الوظيفة الخارجية والذاكرة API (JEP 412). إنه تطور ودمج لوحدتين أخريين من حاضنة Java 16 وهي واجهة API للرابط الأجنبي (JEP 389) وواجهة برمجة تطبيقات الذاكرة الخارجية (JEP 393). كلاهما يوفر الوصول إلى الذاكرة الأصلية والرمز باستخدام البرمجة المكتوبة بشكل ثابت مكتوبة بلغة Java.

مطابقة النمط للتبديل

الميزة النهائية لمعاينة اللغة المضمنة في Java 17 هي تضمين Pattern Matching for Switch (JEP 406). تعمل ميزة اللغة هذه على توسيع تعبيرات وعبارات التبديل وفقًا للنوع ، على غرار الصيغة المستخدمة من خلال مطابقة النمط (JEP 394) ، والتي أصبحت قياسية مع Java 16.

في الماضي ، إذا كنت تريد تنفيذ إجراءات مختلفة بناءً على الطبيعة الديناميكية للكائن ، فستتم مطالبتك بإنشاء سلسلة if-else باستخدام مثيل من عمليات التحقق مثل:

 String type(Object o) { if (o instanceof List) { return "A List of things."; } else if (o instanceof Map) { return "A Map! It has keys and values."; } else if (o instanceof String) { return "This is a string."; } else { return "This is something else."; } }

من خلال الجمع بين تعبير التبديل بالإضافة إلى ميزة مطابقة النمط الجديدة للمفاتيح ، يمكن تقليل العملية إلى شيء مشابه لما يلي:

 String type(Object o) { return switch (o) { case List l -> "A List of things."; case Map m -> "A Map! It has keys and values."; case String s -> "This is a string."; default -> "This is something else."; }; }

كما لاحظت ، هناك إعلان عن متغير في عملية التحقق. مثل المتغيرات الأخرى في Pattern ، فإن مطابقة المثيل تشير إلى أن هذا الكائن قد تم فحصه وإلقاءه ومتاح من المتغير داخل مساحته الحالية.

تعد وظيفة المعاينة خطوة أخرى نحو مطابقة النمط. الخطوة التالية هي تضمين القدرة على تفكيك المصفوفات والسجلات.

هل يجب عليك الترقية إلى Java 17؟

نعم ، يجب عليك الترقية باستمرار إلى أحدث إصدار ، ولكن ليس في أقرب وقت في اليوم الأول. ربما لم يتم تحديث البرامج والمكتبات التي تستخدمها لتتضمن التوافق مع Java 17 ، لذلك قد تحتاج إلى الانتظار لبعض الوقت حتى تنتهي من ذلك.

إذا كنت عالقًا في إصدار LTS من Java مثل Java 8 أو Java 11 ، فهناك العديد من الخيارات داخل اللغة وداخل JVM نفسها التي تتطلب ترقية إلى Java 17. نظرًا لكونها إصدار صيانة طويل المدى ، فهناك فرصة كبيرة لتحديث بيئة الإنتاج الخاصة بك في النهاية إلى Java 17 أيضًا.

إذا كنت تبدأ مشروعًا جديدًا تمامًا ، أو كنت بصدد إعداد مشروعك وجاهزًا لـ Java 17 ، فمن المحتمل أن يكون التبديل إلى Java 17 عاجلاً وليس آجلاً هو الخيار الأكثر فاعلية لأنه يقلل من تكاليف النقل. يتيح هذا أيضًا للمطورين الذين يعملون في المشروع الاستفادة من أحدث الميزات وجانب العمليات.

يمكنك الاستفادة من العديد من التحسينات التي حدثت على مدار السنوات القليلة الماضية ، مثل الدعم المحسن للحاويات التي تعمل على Java ، بالإضافة إلى تطبيقات أداة تجميع البيانات المهملة الجديدة بزمن انتقال منخفض.