ميزات جافا 13

تم إصدار Java 13 للاستخدام الإنتاجي في 17 سبتمبر 2019. لا تحتوي Java 13 على الكثير من الميزات المخصصة للمطور بسبب دورة الإصدار البالغة 6 أشهر.

ميزات Java 13

بعض الميزات المهمة في Java 13 هي:

  • كتل النصوص – JEP 355
  • أساليب جديدة في فئة النصوص للكتل – JEP 355
  • تحسينات في تعبيرات التبديل – JEP 354
  • إعادة تنفيذ واجهة برمجة التطبيقات للمأخذ التقليدي – JEP 353
  • أرشيف CDS الدينامي – JEP 350
  • ZGC: إلغاء تعهيد الذاكرة غير المستخدمة – JEP 351
  • طريقة FileSystems.newFileSystem()
  • دعم لـ Unicode 12.1
  • مصانع DOM وSAX مع دعم للمساحة الاسمية

كيفية تمكين ميزات المعاينة

تعتبر تعبيرات التبديل وكتل النصوص ميزات معاينة. لذا يجب تمكين إعدادات ميزات المعاينة في مشروعك. إذا كنت تقوم بتشغيل برنامج Java من سطر الأوامر، يمكنك تمكينها باستخدام الكود --enable-preview. يمكنك استخدام هذا الكود لبدء JShell مع تمكين ميزات المعاينة.

$ jshell --enable-preview

$ java --enable-preview --source 13 Test.java

إذا كنت تستخدم بيئة تطوير Eclipse، يمكنك تمكين ميزات المعاينة من إعدادات مترجم Java في المشروع.

Eclipse Enable Preview Features

1. كتل النصوص – JEP 355

هذه ميزة معاينة. يسمح لنا بإنشاء سلاسل نصية متعددة الأسطر بسهولة. يجب كتابة السلسلة متعددة الأسطر داخل زوج من علامات الاقتباس الثلاثية المزدوجة. ليس للكائن النصي الذي تم إنشاؤه باستخدام كتل النصوص خصائص إضافية. إنها طريقة أسهل لإنشاء سلاسل نصية متعددة الأسطر. لا يمكننا استخدام كتل النصوص لإنشاء سلسلة نصية مكونة من سطر واحد. يجب أن تتبع علامات الاقتباس الثلاثية المزدوجة المفتوحة عن محطة إنهاء السطر.

package com.journaldev.java13.examples;

public class TextBlockString {

	/**
	 * JEP 355: Preview Feature
	 */
	@SuppressWarnings("preview")
	public static void main(String[] args) {
		String textBlock = """
				Hi
				Hello
				Yes""";

		String str = "Hi\nHello\nYes";

		System.out.println("Text Block String:\n" + textBlock);
		System.out.println("Normal String Literal:\n" + str);

		System.out.println("Text Block and String Literal equals() Comparison: " + (textBlock.equals(str)));
		System.out.println("Text Block and String Literal == Comparison: " + (textBlock == str));
	}

}

الإخراج:

Text Block String:
Hi
Hello
Yes
Normal String Literal:
Hi
Hello
Yes
Text Block and String Literal equals() Comparison: true
Text Block and String Literal == Comparison: true

إنه مفيد في إنشاء سلاسل HTML و JSON بسهولة في برنامج Java الخاص بنا.

String textBlockHTML = """
		<html>
		<head>
			<link href='/css/style.css' rel='stylesheet' />
		</head>
		<body>
                        <h1>Hello World</h1>
                </body>
                </html>""";

String textBlockJSON = """
		{
			"name":"Pankaj",
			"website":"JournalDev"
		}""";

2. أساليب جديدة في فئة السلسلة لكتل النصوص

هناك ثلاثة أساليب جديدة في فئة السلسلة، مرتبطة بميزة كتل النصوص.

  1. formatted(Object… args): إنها مشابهة لأسلوب تنسيق السلسلة format(). تمت إضافتها لدعم التنسيق مع كتل النصوص.
  2. stripIndent(): تستخدم لإزالة الحروف البيضاء العرضية من بداية ونهاية كل سطر في كتلة النص. يستخدم هذا الأسلوب من قبل كتل النصوص ويحافظ على التباعد النسبي للمحتوى.
  3. translateEscapes(): يرجع سلسلة نصية قيمتها هذه السلسلة، مع ترجمة تسلسلات الهروب كما لو كانت في سلسلة نصية.
package com.journaldev.java13.examples;

public class StringNewMethods {

	/***
	 * New methods are to be used with Text Block Strings
	 * @param args
	 */
	@SuppressWarnings("preview")
	public static void main(String[] args) {
		
		String output = """
			    Name: %s
			    Phone: %d
			    Salary: $%.2f
			    """.formatted("Pankaj", 123456789, 2000.5555);
		
		System.out.println(output);
		
		
		String htmlTextBlock = "<html>   \n"+
				                    "\t<body>\t\t \n"+
				                        "\t\t<p>Hello</p>  \t \n"+
				                    "\t</body> \n"+
				                "</html>";
		System.out.println(htmlTextBlock.replace(" ", "*"));
		System.out.println(htmlTextBlock.stripIndent().replace(" ", "*"));
		
		String str1 = "Hi\t\nHello' \" /u0022 Pankaj\r";
		System.out.println(str1);
		System.out.println(str1.translateEscapes());
		
	}

}

الناتج:

Name: Pankaj
Phone: 123456789
Salary: $2000.56

<html>***
	<body>		*
		<p>Hello</p>**	*
	</body>*
</html>
<html>
	<body>
		<p>Hello</p>
	</body>
</html>
Hi	
Hello' " /u0022 Pankaj
Hi	
Hello' " /u0022 Pankaj

3. تحسينات تعبيرات الفتحات – JEP 354

تمت إضافة تعبيرات التبديل كميزة معاينة في إصدار Java 12. إنها تقريبًا نفس الشيء في Java 13 باستثناء أن “break” تم استبداله بـ “yield” لإرجاع قيمة من البيان التالي.

package com.journaldev.java13.examples;

/**
 * JEP 354: Switch Expressions
 * https://openjdk.java.net/jeps/354
 * @author pankaj
 *
 */
public class SwitchEnhancements {

	@SuppressWarnings("preview")
	public static void main(String[] args) {
		int choice = 2;

		switch (choice) {
		case 1:
			System.out.println(choice);
			break;
		case 2:
			System.out.println(choice);
			break;
		case 3:
			System.out.println(choice);
			break;
		default:
			System.out.println("integer is greater than 3");
		}

		// من جافا 13 فصاعدًا - بيانات حالة متعددة العلامات
		switch (choice) {
		case 1, 2, 3:
			System.out.println(choice);
			break;
		default:
			System.out.println("integer is greater than 3");
		}

		// تعبيرات التبديل، استخدم yield للإرجاع، في جافا 12 كانت استراحة
		int x = switch (choice) {
		case 1, 2, 3:
			yield choice;
		default:
			yield -1;
		};
		System.out.println("x = " + x);

	}

	enum Day {
		SUN, MON, TUE
	};

	@SuppressWarnings("preview")
	public String getDay(Day d) {
		String day = switch (d) {
		case SUN -> "Sunday";
		case MON -> "Monday";
		case TUE -> "Tuesday";
		};
		return day;
	}
}

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

تم إعادة كتابة التنفيذ الأساسي لواجهات برمجة التطبيقات java.net.Socket و java.net.ServerSocket. التنفيذ الجديد، NioSocketImpl، هو استبدال قابل للإسقاط لـ PlainSocketImpl. يستخدم java.util.concurrent أقفالًا بدلاً من طرق synchronized. إذا كنت ترغب في استخدام التنفيذ القديم، استخدم خيار جافا -Djdk.net.usePlainSocketImpl.

5. أرشيف CDS الديناميكي – JEP 350

هذا الJEP يوسع ميزة مشاركة بيانات الصف الذي تم تقديمه في جافا 10. الآن، أصبح إنشاء أرشيف CDS واستخدامه أسهل بكثير.

$ java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar

$ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar

6. ZGC: إلغاء تعهد الذاكرة غير المستخدمة – JEP 351

قام هذا الJEP بتحسين ZGC لإرجاع الذاكرة الخردة غير المستخدمة إلى نظام التشغيل. تم تقديم جمع القمامة Z في جافا 11. يضيف فترة توقف قصيرة قبل تنظيف ذاكرة القرص. ولكن، لم يتم إرجاع الذاكرة غير المستخدمة إلى نظام التشغيل. كان هذا قلقًا للأجهزة ذات بصمة ذاكرة صغيرة مثل IoT والرقائق الدقيقة. الآن، تم تحسينه لإرجاع الذاكرة غير المستخدمة إلى نظام التشغيل.

7. طريقة FileSystems.newFileSystem()

تمت إضافة ثلاثة أساليب جديدة إلى فئة FileSystems لتسهيل استخدام موفري نظام الملفات، والتي تعامل محتويات الملف كنظام ملفات.

  1. newFileSystem(Path)
  2. newFileSystem(Path، Map<String،؟>)
  3. newFileSystem(Path، Map<String،؟>، ClassLoader)

8. مصانع DOM وSAX مع دعم للمساحة الاسمية

هناك أساليب جديدة لإنشاء مصانع DOM وSAX مع دعم للمساحة الاسمية.

  1. newDefaultNSInstance()
  2. newNSInstance()
  3. newNSInstance(String factoryClassName، ClassLoader classLoader)
// Java 13 فصاعداً
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder(); 

// قبل Java 13
DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder db = dbf.newDocumentBuilder();

الختام

يبدو أن إصدار Java كل ستة أشهر قد عمل بشكل جيد. لا توجد العديد من الميزات المحددة للمطور، ولكن بشكل عام إنه إصدار رائع. من الجيد رؤية دعم النصوص المتعددة الخطوط الذي انتظره الجميع.

المراجع

Source:
https://www.digitalocean.com/community/tutorials/java-13-features