תכונות Java 13

הושקעה גרסה 13 של Java לשימוש ייצורי ב-17 בספטמבר 2019. אין הרבה תכונות מותאמות למפתחים ב-Java 13 עקב למחזור השחרור הקצר של 6 חודשים.

תכונות של Java 13

חלק מהתכונות החשובות ב-Java 13 הן:

  • בלוקי טקסט – JEP 355
  • שיפורים במתודולוגיה של מחרוזת עבור בלוקי טקסט
  • שדרוגי ביטוי Switch – JEP 354
  • החזרת יישום לסוקט הירושה – JEP 353
  • ארכיב CDS דינמי – JEP 350
  • ZGC: ביטול זיכרון לא בשימוש – JEP 351
  • שיטה FileSystems.newFileSystem()
  • תמיכה ב-Unicode 12.1
  • מפענחי DOM ו-SAX עם תמיכה במרחב שמות

איך להפעיל תכונות תצוגה מקדימה

ביטויי Switch ובלוקי טקסט הם תכונות בתצוגה מקדימה. עליך להפעיל את ההגדרות של תכונות התצוגה מקדימה בפרויקט שלך. אם אתה מפעיל תכנית 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. שדרוגים בביטויי Switch – JEP 354

ביטויי Switch נוספו כתכונה ייאמנת בשחרור Java 12. זה כמעט זהה ב-Java 13 חוץ מהשינוי של "break" שוחלף ב-"yield" להחזיר ערך מההצהרה של case.

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");
		}

		// מ-Java 13 והלאה - הצהרות case רב-תווים
		switch (choice) {
		case 1, 2, 3:
			System.out.println(choice);
			break;
		default:
			System.out.println("integer is greater than 3");
		}

		// ביטויי Switch, השתמש ב-"yield" להחזיר, ב-Java 12 היה "break"
		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. ביצוע מחדש של ממשק ה-API הישן של Socket – JEP 353

המימוש הבסיסי של java.net.Socket ו-java.net.ServerSocket APIs נכתב מחדש. המימוש החדש, NioSocketImpl, הוא החלפה נפילה ל-PlainSocketImpl. הוא משתמש בנעילות java.util.concurrent במקום בשיטות synchronized. אם ברצונך להשתמש במימוש הישן, השתמש באפשרות java -Djdk.net.usePlainSocketImpl.

5. ארכיון CDS דינמי – JEP 350

ה-JEP הזה מרחיב על יכולת שיתוף המחלקות (CDS), שהוצגה ב־Java 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 נוכח ב־Java 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