תכונות Java 12

סוף סוף, JDK 12 שהוא חלק ממחזור השחרורים של ששה חודשים, כאן. הוא מגיע אחרי גרסת Java LTS האחרונה 11. ביררנו באורך על תכונות Java 11 לפני כן. היום נדון בתכונות של Java 12 ונראה מה יש באמבר למפתחים. Java 12 הושקה ב-19 במרץ 2019. זו גרסה שאינה LTS. לכן אין לה תמיכה לטווח ארוך.

תכונות של Java 12

חלק מתכונות Java 12 החשובות הן;

  1. שינויים ב-JVM – JEP 189, JEP 346, JEP 344, ו-JEP 230.
  2. ביטויי מעבר
  3. שיטת mismatch() של קובץ
  4. פירמוט קיצוץ מספר
  5. איסוף של Teeing ב-Stream API
  6. שיטות חדשות במחרוזות Java – indent(), transform(), describeConstable(), ו-resolveConstantDesc().
  7. JEP 334: API קבועים של JVM
  8. JEP 305: תואם תבניות עבור instanceof
  9. Raw String Literals הוסר מ-JDK 12.

בואו נסתכל על כל אלו תכונות של Java 12 אחת-אחת.

שינויים ב-JVM

1. JEP 189 – Shenandoah: אוסף אשפה בזמן השהייה נמוך (ניסיוני)

RedHat הפעילו את אוסף האשפה של Shenandoah כדי להפחית את זמני השהייה של GC. הרעיון הוא להריץ את GC באופן סמוכי עם תהליכי ה-Java הפועלים. המטרה היא ליצור השהיות קצרות וצפויות באופן עקבי וחסר תלות בגודל ה-heap. לכן אין חשיבות אם גודל ה-heap הוא 15 מגה-בייט או 15 גיגה-בייט. זו תכונה ניסיונית ב-Java 12.

2. JEP 346 – החזרה מידית של זיכרון שנמצא בשימוש מ- G1

החל מ-Java 12, G1 כעת יבדוק את זיכרון ה-heap של Java במהלך הלא פעילות של היישום ויחזיר אותו למערכת ההפעלה. זו מדינה פעולתית כדי לשמור ולהשתמש בזיכרון פנוי.

3. JEP 344: איסור אוספים מעורבים ל-G1

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

4. JEP 230 ו-344

אוסף בדיקות ביצוע קטן, JEP 230 מוסיף מערך בסיסי של בדיקות ביצוע קטנות לקוד המקור של JDK. זה יעשה זאת קלה למפתחים להריץ בדיקות ביצוע קיימות וליצור חדשות. ממיני AArch64 אחד, לא שניים, JEP 344, מסיר את כל המקורות הקשורים ליצירת הפורט arm64 בזמן ששומר על פורט 32-ביט ARM ופורט 64-ביט aarch64. זה מאפשר לתורמים להתמקד במימוש 64-ביט ARM יחיד

5. JEP 341 קבצי CDS ברירת מחדל

משפר את תהליך בניית ה-JDK כך שיצירת ארכיונים של שיתוף נתונים בכיתות (CDS) תתבצע באופן אוטומטי, עם רשימת הכיתות ברירת המערכת, על פלטפורמות 64-ביט. המטרה היא לשפר את זמן ההתחלה. מ-Java 12, CDS הוא ברירת המחדל. כדי להריץ את התוכנית שלך עם CDS כבוי, עשה את הבא:

java -Xshare:off HelloWorld.java

כעת, זה יאריך את זמן ההתחלה של התוכנית.

שינויים בשפה ותכונות

Java 12 הוסיפה רבות מאוד תכונות לשפה. בואו נסתכל על כמה מתכונות אלה עם הטפות.

1. ביטויי Switch (תצוגה מקדימה)

Java 12 העשירה את ביטויי ה-Switch לצורך התאמה לתבנית. הובאו להקדמה ב־JEP 325, כתכונת שפה מקדימה, התחביר החדש הוא L ->. הנה מספר דברים לשימוש:

  • התחביר החדש מסיר את הצורך בהגבלת הביטוי למניעת עבר דרך.
  • ביטויי Switch כבר לא עוברים דרך.
  • בנוסף, אנו יכולים להגדיר מספר קבועים באותו תווית.
  • תיקוי ה־default הוא חובה עכשיו בביטויי Switch.
  • break משמש בביטויי Switch כדי להחזיר ערכים מתוך מקרה עצמו.

הצהרת Switch קלסית:

String result = "";
        switch (day) {
            case "M":
            case "W":
            case "F": {
                result = "MWF";
                break;
            }
            case "T":
            case "TH":
            case "S": {
                result = "TTS";
                break;
            }
        };

        System.out.println("Old Switch Result:");
        System.out.println(result);

עם ביטוי ה-Switch החדש, אין צורך להגדיר break בכל מקום ולכן מונעים שגיאות לוגיות!

String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    break "Please insert a valid day.";
                else
                    break "Looks like a Sunday.";
            }

        };

        System.out.println(result);

בואו נריץ את התוכנית למטה הכוללת את ביטוי ה-Switch החדש באמצעות JDK 12.

public class SwitchExpressions {

    public static void main(String[] args)
    {
        System.out.println("New Switch Expression result:");
        executeNewSwitchExpression("M");
        executeNewSwitchExpression("TH");
        executeNewSwitchExpression("");
        executeNewSwitchExpression("SUN");
    }

    public static void executeNewSwitchExpression(String day){

        String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    break "Please insert a valid day.";
                else
                    break "Looks like a Sunday.";
            }

        };

        System.out.println(result);
    }
}

מכיוון שזוהי תכונת תצוגה מקדימה, אנא וודא שבחרת ברמת שפה כשפת תצוגה של Java 12. כדי לקמפל את הקוד שנתת מעלה, הרץ את הפקודה הבאה:

javac -Xlint:preview --enable-preview -source 12 src/main/java/SwitchExpressions.java

לאחר הרצת התוכנית שנקמפלה, נקבל את התוצאה הבאה בקונסולה:

Java Switch Expressions Program Output

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

2. שיטת mismatch של קובץ

ב-Java 12 נוספה השיטה הבאה להשוואת שני קבצים:

public static long mismatch(Path path, Path path2) throws IOException

השיטה מחזירה את המיקום של ההתאמה הראשונה או -1L אם אין התאמה. שני קבצים יכולים להיות בעלי התאמה בתרחישים הבאים:

  • אם הבתים אינם זהים. במקרה זה, מוחזר המיקום של הבת הראשונה שאינה זהה.
  • גדלי הקבצים אינם זהים. במקרה זה, מוחזר גודל הקובץ הקטן יותר.

דוגמת קוד קטע מ-IntelliJ Idea ניתנת להלן:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class FileMismatchExample {

    public static void main(String[] args) throws IOException {
        Path filePath1 = Files.createTempFile("file1", ".txt");
        Path filePath2 = Files.createTempFile("file2", ".txt");
        Files.writeString(filePath1,"JournalDev Test String");
        Files.writeString(filePath2,"JournalDev Test String");

        long mismatch = Files.mismatch(filePath1, filePath2);

        System.out.println("File Mismatch position... It returns -1 if there is no mismatch");

        System.out.println("Mismatch position in file1 and file2 is >>>>");
        System.out.println(mismatch);

        filePath1.toFile().deleteOnExit();
        filePath2.toFile().deleteOnExit();

        System.out.println();

        Path filePath3 = Files.createTempFile("file3", ".txt");
        Path filePath4 = Files.createTempFile("file4", ".txt");
        Files.writeString(filePath3,"JournalDev Test String");
        Files.writeString(filePath4,"JournalDev.com Test String");

        long mismatch2 = Files.mismatch(filePath3, filePath4);

        System.out.println("Mismatch position in file3 and file4 is >>>>");
        System.out.println(mismatch2);

        filePath3.toFile().deleteOnExit();
        filePath4.toFile().deleteOnExit();



    }

}

הפלט כאשר התוכנה ב-Java שנתת מקומפלת ורצה הוא:

Java File Mismatch Example Program Output

3. עיצוב מספר מצומצם

import java.text.NumberFormat;
import java.util.Locale;

public class CompactNumberFormatting {


    public static void main(String[] args)
    {
        System.out.println("Compact Formatting is:");
        NumberFormat upvotes = NumberFormat
                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
        upvotes.setMaximumFractionDigits(1);

        System.out.println(upvotes.format(2592) + " upvotes");


        NumberFormat upvotes2 = NumberFormat
                .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
        upvotes2.setMaximumFractionDigits(2);
        System.out.println(upvotes2.format(2011) + " upvotes");
    }


}
Java Compact Number Formatting Program Output

4. אוספי Teeing

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

double mean = Stream.of(1, 2, 3, 4, 5)
                .collect(Collectors.teeing(
                        summingDouble(i -> i),
                        counting(),
                        (sum, n) -> sum / n));

System.out.println(mean);

הפלט הוא 3.0.

5. שיטות חדשות במחרוזות Java

4 שיטות חדשות הוצגו ב-Java 12, שהן:

  • indent(int n)
  • transform(Function f)
  • Optional describeConstable()
  • String resolveConstantDesc​(MethodHandles.Lookup lookup)

כדי לדעת על השיטות הנ"ל ועל המימוש שלהן בפרטיות, ראה את המדריך שלנו על שיטות המחרוזות של Java 12.

6. JEP 334: API קבועים של JVM

A new package java.lang.constant is introduced with this JEP. This is not that useful for those developers who don’t use constants pool.

7. JEP 305: התאמת תבנית ל- instanceof (תצוגה מקדימה)

תכונת שפה נוספת לתצוגה מקדימה! הדרך הישנה להמיר סוג לסוג אחר היא:

if (obj instanceof String) {
    String s = (String) obj;
    // השתמש ב- s בקוד שלך מכאן
}

הדרך החדשה היא:

if (obj instanceof String s) {
    // ניתן להשתמש ב- s ישירות כאן
} 

זה חוסך לנו מספר מהמרות סוג שהיו בלתי נחוצות.

מחרוזות סדורות גולמיות הוסרו מ-JDK 12.

זה מסיים את המאמר על תכונות Java 12.

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