תכונות חדשות של Java 13

1. סקירה כללית

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

2. תצוגה מקדימה של תכונות המפתחים

Java 13 הביא שתי תכונות שפה חדשות, אם כי במצב התצוגה המקדימה. זה מרמז על כך שתכונות אלה מיושמות באופן מלא עבור הערכת מפתחים, אך אינן מוכנות לייצור. כמו כן, ניתן להסיר אותם או להפוך אותם לקבועים במהדורות עתידיות על סמך משוב.

עלינו לציין –אפשר תצוגה מקדימה כדגל שורת פקודה לשימוש בתכונות התצוגה המקדימה. בואו נסתכל עליהם לעומק.

2.1. החלף ביטויים (JEP 354)

בתחילה ראינו ביטויי מתג ב- JDK 12. Java 13's החלף ביטויים לבנות על הגרסה הקודמת על ידי הוספת חדש תְשׁוּאָה הַצהָרָה.

באמצעות תְשׁוּאָה, כעת אנו יכולים להחזיר ערכים ביעילות מביטוי מתג:

@Test @SuppressWarnings ("תצוגה מקדימה") בטל בציבור כאשר SwitchingOnOperationSquareMe_thenWillReturnSquare () {var me = 4; פעולת var = "squareMe"; var result = switch (operation) {case "doubleMe" -> {תני לי * 2; } מקרה "squareMe" -> {תני לי * אותי; } ברירת מחדל -> אני; }; assertEquals (16, תוצאה); }

כפי שאנו רואים, כעת קל ליישם את דפוס האסטרטגיה באמצעות החדש החלף.

2.2. חסימות טקסט (JEP 355)

תכונת התצוגה המקדימה השנייה היא חסימות טקסט לרב-שורות חוּטs כגון JSON מוטבע, XML, HTML וכו '.

מוקדם יותר, כדי להטמיע את JSON בקוד שלנו, נכריז עליו כ- חוּט מילולי:

מחרוזת JSON_STRING = "{\ r \ n" + "\" שם \ ": \" Baeldung \ ", \ r \ n" + "\" אתר \ ": \" // www.% S.com / \ " \ r \ n "+"} ";

עכשיו בואו נכתוב את אותו JSON באמצעות חוּט גושי טקסט:

מחרוזת TEXT_BLOCK_JSON = "" "{" name ":" Baeldung "," website ":" //www.%s.com/ "}" "";

כפי שניכר, אין צורך לחמוק מהצעות מחיר כפולות או להוסיף החזרת כרכרה. באמצעות גושי טקסט, ה- JSON המוטבע פשוט הרבה יותר לכתיבה וקל יותר לקריאה ולתחזוקה.

יתר על כן, הכל חוּט פונקציות זמינות:

@ מבחן ציבורי בטל כאשר TextBlocks_thenStringOperationsWorkSame () {assertThat (TEXT_BLOCK_JSON.contains ("Baeldung")). IsTrue (); assertThat (TEXT_BLOCK_JSON.indexOf ("www")). isGreaterThan (0); assertThat (TEXT_BLOCK_JSON.length ()). isGreaterThan (0); } 

גַם, מיתר כעת יש שלוש שיטות חדשות לתמרן גושי טקסט:

  • stripIndent () - מחקה את המהדר כדי להסיר שטח לבן אגב
  • translateEscapes () - מתרגם רצפי בריחה כגון "\ t" ל "\ T"
  • מעוצב () - עובד כמו מחרוזת :: פורמט, אלא עבור גושי טקסט

בואו נסתכל במהירות על א מחרוזת :: מעוצב דוגמא:

assertThat (TEXT_BLOCK_JSON.formatted ("baeldung"). מכיל ("www.baeldung.com")). isTrue (); assertThat (String.format (JSON_STRING, "baeldung"). מכיל ("www.baeldung.com")). isTrue (); 

מכיוון שבלוקי טקסט הם תכונת תצוגה מקדימה וניתן להסיר אותם במהדורה עתידית, שיטות חדשות אלה מסומנות לשינוי.

3. ארכיוני CDS דינמיים (JEP 350)

שיתוף נתוני כיתות (CDS) היה מאפיין בולט ב- Java HotSpot VM מזה זמן מה. זה מאפשר מטא נתונים בכיתה שיש לשתף בין JVM שונים כדי להפחית את זמן ההפעלה וטביעת הרגל של הזיכרון. JDK 10 הרחיב את היכולת הזו על ידי הוספת יישומי CDS (AppCDS) - כדי לתת למפתחים את הכוח לכלול שיעורי יישומים בארכיון המשותף. JDK 12 שיפר עוד יותר את התכונה הזו כדי לכלול ארכיוני CDS כברירת מחדל.

עם זאת, תהליך הארכיון של שיעורי יישומים היה מייגע. כדי ליצור קבצי ארכיון, המפתחים נאלצו לבצע ריצות ניסיון של היישומים שלהם כדי ליצור תחילה רשימת כיתות ואז לזרוק אותה לארכיון. לאחר מכן, ניתן להשתמש בארכיון זה לשיתוף מטא-נתונים בין JVM.

עם ארכיון דינמי, JDK 13 פשט את התהליך הזה. עַכשָׁיו אנו יכולים ליצור ארכיון משותף בזמן יציאת היישום. זה ביטל את הצורך בריצות ניסיון.

כדי לאפשר ליישומים ליצור ארכיון משותף דינמי על גבי ארכיון המערכת המוגדר כברירת מחדל, עלינו להוסיף אפשרות -XX: ArchiveClassesAtExit וציין את שם הארכיון כארגומנט:

java -XX: ArchiveClassesAtExit = -cp AppName

לאחר מכן נוכל להשתמש בארכיון החדש שנוצר להפעלת אותה אפליקציה -XX: SharedArchiveFile אוֹפְּצִיָה:

java -XX: SharedArchiveFile = -cp AppName

4. ZGC: זיכרון לא בשימוש שאינו מחויב (JEP 351)

ה- Z Garbage Collector הוצג בג'אווה 11 כמנגנון איסוף זבל בעל זמן אחזור, כך שזמני ההשהיה של GC מעולם לא עברו את ה- 10 ms. עם זאת, בניגוד ל- HotSpot VM GC אחרים כגון G1 ו- Shenandoah, הוא לא היה מצויד להחזיר זיכרון ערימה שאינו בשימוש למערכת ההפעלה. Java 13 הוסיפה יכולת זו ל- ZGC.

כעת אנו מקבלים טביעת רגל זיכרון מופחתת יחד עם שיפור ביצועים.

החל מ- Java 13, ה- ZGC מחזיר כעת זיכרון לא מחויב למערכת ההפעלה כברירת מחדל, עד להגיע לגודל הערימה המינימלי שצוין. אם איננו רוצים להשתמש בתכונה זו, נוכל לחזור לדרך Java 11 על ידי:

  • שימוש באפשרות -XX: -Z Uncommit, אוֹ
  • הגדרת מינימום שווה (-Xms) ומקסימום (-Xmx) גדלי ערימה

בנוסף, ל- ZGC כעת גודל ערימה נתמך מרבי של 16 טרה-בתים. מוקדם יותר, 4TB היה הגבול.

5. הפעל מחדש את ממשק ה- API של Socket Legacy (JEP 353)

ראינו שקע (java.net. שקע ו java.net.ServerSocket) ממשקי API כחלק בלתי נפרד מג'אווה מאז הופעתה. עם זאת, הם מעולם לא עברו מודרניזציה בעשרים השנים האחרונות. הם נכתבו בג'אווה ו- C מדור קודם, הם היו מסורבלים וקשים לתחזוקה.

Java 13 הקפיץ את המגמה הזו והחליף את היישום הבסיסי כדי ליישר את ה- API לשרשורי מצב המשתמש העתידני. במקום PlainSocketImpl, ממשק הספק מצביע כעת על NioSocketImpl. יישום מקודד זה מבוסס על אותה תשתית פנימית כמו java.nio.

שוב, יש לנו דרך לחזור לשימוש PlainSocketImpl. אנו יכולים להפעיל את ה- JVM עם מאפיין המערכת -Djdk.net.usePlainSocketImpl נקבע כ נָכוֹן להשתמש ביישום הישן יותר. ברירת המחדל היא NioSocketImpl.

6. שינויים שונים

מלבד ה- JEP שצוינו לעיל, Java 13 סיפקה לנו כמה שינויים בולטים נוספים:

  • java.nio - שיטה FileSystems.newFileSystem (נתיב, מפה) הוסיף
  • java.time - נוסף שם עידן יפני רשמי חדש
  • javax.crypto - תמיכה ב- MS Cryptography Next Generation (CNG)
  • javax.security - תכונה jdk.sasl.disabledMechanisms נוסף להשבתת מנגנוני SASL
  • javax.xml.crypto - חדש חוּט קבועים שהוצגו כדי לייצג URIs של CanonML XML 1.1
  • javax.xml.parsers - שיטות חדשות שנוספו להפעלת מפעלים DOM ו- SAX עם תמיכה במרחבי שמות
  • תמיכת Unicode שודרגה לגרסה 12.1
  • תמיכה שנוספה לשמות ראשיות של Kerberos לקנוניזציה והפניות בין תחומים

בנוסף, כמה ממשקי API מוצעים להסרה. אלה כוללים את השלושה חוּט השיטות המפורטות לעיל, וה- javax.security.cert ממשק API.

בין ההסרות כוללות את רמיק כלי ותכונות ישנות מכלי JavaDoc. טרום JDK 1.4 SocketImpl יישומים גם אינם נתמכים עוד.

7. מסקנה

במאמר זה ראינו את כל חמש הצעות השיפור של JDK המיושמות על ידי Java 13. כמו כן, רשמנו כמה תוספות ומחיקות בולטות אחרות.

כרגיל, קוד המקור זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found