JavaRush /مدونة جافا /Random-AR /جافا 13: ميزات جديدة

جافا 13: ميزات جديدة

نشرت في المجموعة
لقد اعتدنا بالفعل على ظهور إصدار JDK جديد كل ستة أشهر. حتى الآن، كان هذا النهج مبررًا، وكانت مخاوف بعض المطورين من عدم مواكبة التحديثات عبثًا: هناك عدد قليل من التغييرات لمدة ستة أشهر ولم تعد عالمية كما كانت من قبل. حسنًا، قد لا يلاحظ المبرمجون المبتدئون الابتكار على الإطلاق. جافا 13: ميزات جديدة - 1ومع ذلك، من الأفضل لمطوري البرمجيات المستقبليين مواكبة الابتكارات. في هذه المقالة، سنصف تقليديًا مقترحات التمديد المقبولة (JEPs). يتضمن Java 13 خمسة عناصر JEP فقط و76 عنصرًا أساسيًا جديدًا للمكتبة (نصفها تقريبًا عبارة عن إضافات بسيطة إلى حزمة java.io).

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

لنبدأ بتغيير بناء جملة اللغة. وأهمها الكتل النصية. إنها تسمح لك بتجنب الهروب من الأحرف ومعرفة كيفية تنسيق السلاسل. ربما تتذكر أن JDK 12 لم يتضمن ميزة Raw String Literals (JEP 326) المتوقعة للعمل مع السلسلة الحرفية. في Java 13، تم استبداله بـ JEP 355 مع كتل النص الخاصة به. ربما تتذكر أنه في Java، يتم تغليف السلسلة بين علامتي اقتباس مزدوجتين. هذا أمر جيد، لكن المشكلة تكمن في أن السطر لا يمكن أن يشغل أكثر من سطر واحد من الملف المصدر (لتجنب الخلط مع سطر Java، سنسمي سطر الملف هنا "سطر"). حسنًا، دعنا نتجول ونستخدم، على سبيل المثال، الرمز \nإذا كان هناك حاجة إلى فاصل، أو سلسلة من التعبيرات متعددة الأسطر. لا يبدو الأمر جيدًا جدًا! تعتبر النصوص الحرفية التي تحتوي على أجزاء HTML أو XML أو SQL أو JSON مرهقة بشكل خاص. كل هذا الهروب والتسلسل والتحرير اليدوي يجعل الكود غير مريح للكتابة ويصعب قراءته. تحاول الكتل النصية حل هذه المشكلة. يبدأون اه... بعلامات اقتباس مزدوجة ثلاثية وينتهون بها (أعلم أن هذا لا يبدو جيدًا جدًا). يتم تفسير كل شيء بين علامتي الاقتباس كجزء من السطر، بما في ذلك الأسطر الجديدة. يمكن استخدام الكتل النصية تمامًا مثل النصوص الحرفية القياسية، وستقوم Java بتجميع التعليمات البرمجية بنفس الطريقة. يجب أن يتبع علامات الاقتباس الافتتاحية محدد سطر؛ لا يمكن استخدام الكتل النصية في سطر واحد، لذا فإن الكود
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 كميزة معاينة. وهذا يعني أنه لم يتم تضمينها بعد في مواصفات لغة Java المقابلة. أي أنه ليس من الواضح ما إذا كانت هذه الميزة ستصبح جزءًا دائمًا من اللغة أم أنها مجرد ضيف هنا. حاليًا، يمكن للمطورين اختبار الميزة وإبداء رأيهم فيها. سيعتمد مصير الكتل النصية على ذلك: يمكن تحسين الميزة، وإذا لم تعجبك، فيمكن إزالتها تمامًا. إذا كنت تريد تجربة الكتل النصية عمليًا، فتذكر أنه يجب تضمين ميزات المعاينة بشكل صريح لتجميعها وتشغيلها. التحويل البرمجي:

javac --enable-preview --release 13 TextBlock.java
لتشغيل التطبيق، تحتاج إلى تمكين ميزات المعاينة:

java --enable-preview TextBlock
يحتوي الفصل Stringعلى ثلاث طرق جديدة تكمل تغيير اللغة هذا:
  • formatted(): قم بتنسيق سلسلة باستخدام السلسلة نفسها كسلسلة تنسيق. يعادل التحديformat(this, args)
  • stripIndent(): إزالة المسافات العشوائية من السلسلة. يعد هذا مفيدًا إذا كنت تقرأ سلاسل متعددة الأسطر وتريد تطبيق نفس استبعاد المسافة البيضاء كما تفعل مع الإعلان الصريح.
  • translateEscapes(): إرجاع سلسلة بتسلسلات الهروب (مثل \ r)، وترجمتها إلى قيمة Unicode المناسبة.
من المثير للاهتمام أن هذه الأساليب ظهرت للتو، ولكن تم وضع علامة عليها بالفعل على أنها مهملة ... يشير هذا الوضع إلى أنه قد تتم إزالتها في إصدار مستقبلي من JDK. يبدو غريبًا بعض الشيء إضافة طريقة جديدة والتخلي عنها على الفور. ومع ذلك، يرجى ملاحظة أن هذه الطرق مرتبطة بميزة المعاينة التي يمكن تغييرها أو إزالتها. ربما يساعد تقديم تعليق توضيحي @PreviewFeatureفي مثل هذه المواقف، لكنه لم يتم تضمينه بعد في JDK (على الرغم من أنه من المحتمل جدًا أن يظهر في JDK 14).

JEP 354 : تبديل التعبير (معاينة)

قدمت Java 12 اقتراحًا لشكل جديد من تعبيرات الكتابة باستخدام بيان التبديل - JEP 325 . وتبين أنها أول ميزة معاينة على الإطلاق، ويثبت مصيرها أن تقديم المقترحات للمستخدمين يعد فكرة رائعة. قبل JDK 12، switchكان من الممكن استخدامه فقط كبيان ينفذ إجراءً ولكن لا يُرجع نتيجة. ولكن في Java 12 سمح باستخدامه switchكتعبير يُرجع نتيجة يمكن تخصيصها لمتغير. كانت هناك تغييرات أخرى في بناء جملة بيانات الحالة داخل 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);
}
في هذا المثال، نستخدم value dayOfWeekلتعيين القيمة لـ numberOfLetters. نظرًا لخصائص عمل المشغل switch، فإن هذا الرمز ليس الأجمل ومن السهل ارتكاب الأخطاء. أولاً، إذا نسينا تطبيق عبارة breakعلى كل مجموعة من تسميات الحالة، فسوف ننتقل افتراضيًا إلى المجموعة التالية من تسميات الحالة. وهذا يمكن أن يؤدي إلى أخطاء يصعب العثور عليها. ثانيًا، يجب علينا تحديد كل مجموعة من تسميات الحالة. إذا نسينا، فسنحصل بالطبع على خطأ في المترجم، لكن هذا الخيار ليس مثاليًا. كما أن الكود الخاص بنا مطول تمامًا لأن كل قيمة 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);
};
وفقًا لمجتمع Java، breakقد يكون استخدام التحميل الزائد لتحديد قيمة الإرجاع أمرًا مربكًا. تتيح لك لغة Java أيضًا استخدام break( و continue) مع تسمية مثل عامل الانتقال غير المشروط goto. قام JEP 354 بتغيير هذا الاستخدام break، لذلك في Java 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);
};
ترتبط JEPs الثلاثة التالية بجهاز Java Virtual Machine.

أرشيف الأقراص المضغوطة الديناميكية JEP 350

يتيح لك هذا الامتداد أرشفة الفئات ديناميكيًا في نهاية تنفيذ تطبيق Java. تسمح لك أقراص CDS أو Class Data Sharing بجمع جميع الفئات التي تم إطلاقها عند بدء التشغيل في أرشيف خاص class data sharing، باستخدام قائمة هذه الفئات نفسها بشكل افتراضي. وهذا يؤدي إلى تسريع كبير في إطلاق التطبيقات وحفظ ذاكرة الوصول العشوائي. في السابق، كان استخدام AppCDS عبارة عن عملية متعددة الخطوات تتضمن إنشاء قائمة بالفئات ذات الصلة واستخدام تلك القائمة لإنشاء أرشيف يمكن استخدامه لعمليات التشغيل اللاحقة. الآن كل ما هو مطلوب هو تشغيل التطبيق مرة واحدة باستخدام العلامة -XX: ArchiveClassesAtExitالتي تشير إلى الموقع الذي سيتم كتابة الأرشيف فيه. باستخدام هذا الأسلوب، يتم تجميع الفئات تلقائيًا في الأرشيف بعد إيقاف التطبيق بشكل طبيعي.

JEP 351 ZGC : إلغاء الذاكرة غير المستخدمة

قبل عام، قدم JDK 11 ZGC، وهو مجمع قمامة تجريبي وقابل للتطوير ومنخفض الكمون. في البداية، تصرفت ZGC بشكل غريب إلى حد ما: فهي لم تسمح بإعادة الذاكرة إلى نظام التشغيل، حتى لو لم تعد هناك حاجة إليها. بالنسبة لبعض البيئات، مثل الحاويات، حيث يتم استخدام الموارد بواسطة خدمات متعددة في نفس الوقت، قد يحد ذلك من قابلية التوسع وكفاءة النظام. تتكون كومة ZGC مما يسمى ZPages. عندما يتم مسح ZPages أثناء دورة جمع البيانات المهملة، يتم إرجاعها إلى ZPageCache. يتم ترتيب ZPages الموجودة في ذاكرة التخزين المؤقت هذه حسب مدى حداثة استخدامها. في Java 13، ستعيد ZGC الصفحات التي تم تحديدها على أنها غير مستخدمة لفترة طويلة إلى نظام التشغيل. وبهذه الطريقة يمكن إعادة استخدامها لعمليات أخرى.

JEP 353 إعادة تنفيذ واجهة برمجة تطبيقات المقبس القديمة

java.net.Socketلا يزال كلا تطبيقي واجهة برمجة التطبيقات (API) java.net.ServerSocketJDK 1.0. في هذا، وجميع JDKs اللاحقة، يستخدم تنفيذ واجهات برمجة التطبيقات هذه العديد من التقنيات (مثل استخدام مكدس مؤشر الترابط كمخزن مؤقت للإدخال / الإخراج) مما يجعلها غير مرنة ويصعب صيانتها. لحل هذه المشكلة، تم توفير تطبيق جديد في JDK 13 NioSocketImpl. لم يعد يتطلب تعليمات برمجية أصلية، مما يسهل النقل إلى منصات مختلفة. تستخدم هذه الفئة أيضًا آلية التخزين المؤقت الموجودة (تجنب استخدام مكدس مؤشر الترابط لهذا الغرض) والقفل java.util.concurrentبدلاً من الأساليب المتزامنة. سيؤدي هذا إلى تبسيط التكامل مع الألياف من Project Loom .

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

ذكرنا سابقًا أن Java 13 يتضمن 76 واجهة برمجة تطبيقات جديدة في مكتبات الفئة الأساسية. وهي تغطي المجالات التالية:
  • تحديثات دعم Unicode.
  • ثلاث طرق جديدة 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