תכונות של Java 14

נשמור על המסורת של מחזור שישה חודשים, לאחר ששוחררה Java 13 ב-17 בספטמבר 2019, Java 14, גרסה נוספת שאינה LTS, מתוכננת לשוחרר ב-17 במרץ 2020.

תכונות Java 14

הנה רשימת התכונות של Java 14:

  • ביטויי Switch (תקן) – JEP 361
  • התאמת תבנית ל-instanceof (תצוגה מקדימה) – JEP 305
  • שגיאות NullPointerExceptions שימושיות – JEP 358
  • רשומות (תצוגה מקדימה) – JEP 359
  • בלוקי טקסט (תצוגה שנייה) – JEP 368
  • כלי אריזה (אינקובטור) – JEP 343
  • הקצאת זיכרון מודע ל-NUMA עבור G1 – JEP 345
  • זרימת אירועים של JFR – JEP 349
  • בפופריות שאינן נדמות – JEP 352
  • ZGC על macOS – JEP 364
  • ZGC על Windows – JEP 365
  • API לגישה לזיכרון זר (אינקובטור) – JEP 370

התקנת Java 14 על Mac OS

  • להתחיל עם Java 14, הורד את JDK מכאן.
  • העתק וחלץ את קובץ ה-Tar לתיקיית /Library/Java/JavaVirtualMachines כפי שמוצג למטה:
$ cd /Library/Java/JavaVirtualMachines

$ sudo cp ~/Downloads/openjdk-14_osx-x64_bin.tar.gz /Library/Java/JavaVirtualMachines

$ sudo tar xzf openjdk-14_osx-x64_bin.tar.gz

$ sudo rm openjdk-14_osx-x64_bin.tar.gz

כאשר זה נעשה, פתח את קובץ ה-bash_profile באמצעות כל עורך טקסט. אני משתמש ב־vim ~/.bash_profile. הגדר את הנתיב של Java 14 ל-JAVA_HOME, שמור את השינויים ובצע source ~/.bash_profile כדי להחזיר את השינויים.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home

סופית, אתה מוכן להידרש ולהריץ תוכניות באמצעות Java 14. נשתמש ב־JShell, כלי שורת פקודה אינטרקטיבי REPL לבדיקה מהירה של תכונות Java 14 החדשות.

חשוב לציין כי רבות מהתכונות ששוחררו ב-Java 14 הן בתקופת ראיון. זה אומר שלמרות שהן פועלות לגמרי כרגע, יתכן שיהיו שינויים בעתיד. חלק מהן עשויות להפוך לתקן או פשוט להסיר במחזורי השחרור הבאים. כדי לבדוק תכונות בתקופת ראיון, עליך להגדיר באופן מפורש --enable-preview בעת הרצת ה-JShell או התוכנית ב-Java כפי שמוצג למטה:

jshell --enable-preview

javac --release 14 --enable-preview Author.java

בקטעים הבאים, בוא נדון בחלק מהתכונות של השפה וה-JVM.

קריאה מומלצת: התקנת Java 14 על Linux

1. ביטויי מעבר

הביטויים Switch לאחר שהיו תכונת תצורה בשני הגרסאות האחרונות – Java 12 ו-Java 13 סוף סוף השיגו סטטוס קבע ב-Java 14.

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

Java 14 סוף סוף הפכה את אלו לתכונות סטנדרטיות כעת.

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

        };
System.out.println(result);
Java 14 Switch Expressions

הערה: Yield אינה מילת מפתח חדשה ב-Java. היא נעשית שימוש בידעוואים Switch.

2. תיקוף תצורה עבור instanceof (תצורה)

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

Java 14 משחררת מההפרטה הזו והופכת את גילוי התנאי להרבה יותר קצר.

לפני Java 14:

if (obj instanceof Journaldev) {
  Journaldev jd = (Journaldev) obj;
  System.out.println(jd.getAuthor());
}

Java 14 ואילך:

if (obj instanceof Journaldev jd) {
  System.out.println(jd.getAuthor());
}

בקוד לעיל, המופע jd יועבר רק אם obj הוא מסוג Journaldev. טווח המשתנה מוגבל לבלוק התנאי בלבד.

3. NullPointerExceptions מועילים

חראי Null Pointer הם סיוט עבור כל מפתח. בעבר, עד לגרסה 13 של ג'אווה, היה מסובך לאבחן את ה-NPEs הבלתי נפרדים. מפתחים היו צריכים להיעזר בכלים אחרים לאבחון או לזהות באופן ידני את המשתנה/השיטה שהיה null מאחר וסטאק טרייס הראה רק את מספר השורה.

לפני ג'אווה 14:

String name = jd.getBlog().getAuthor()

//סטאק טרייס
Exception in thread "main" java.lang.NullPointerException
    at NullPointerExample.main(NullPointerExample.java:5)

ג'אווה 14 הכניסה תכונת JVM חדשה שמעניקה הבנה טובה יותר עם סטאק תיאורי יותר מתאר.

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Blog.getAuthor()" because the return value of "Journaldev.getBlog()" is null
    at NullPointerExample.main(NullPointerExample.java:4)

הערה: התכונה לעיל אינה תכונת שפה. זו שיפור בסביבת הריצה.

4. רשומות (תצוגה מקדימה)

A record is a data class that stores pure data. The idea behind introducing records is to quickly create simple and concise classes devoid of boilerplate code.

רגילות, בג'אווה, קלאס דורש ממך ליישם את equals(), hashCode() , ואת שיטות ה-getters וה-setters. בעוד שקצת IDEs תומכים ביצירת אוטומטית של כזה קלאסים, הקוד עדיין דוחה. עם record אתה צריך פשוט להגדיר קלאס בדרך הבאה.

record Author(){}
//או
record Author (String name, String topic) {}

המהדר של ג'אווה יצור בנאי, שדות סופיים פרטיים, גישה, שוויונים/פונקציות דומיות, ושיטות equals/hashCode ו־toString באופן אוטומטי. שיטות ה-Getter שיוצרו אוטומטית למעלה מהמחלקה הזו הם name() ו־topic().

כדי להסתכל על הקוד שנוצר, יש להשתמש ב־javap Author לאחר שקומפלת את התוכנית באמצעות javac. התרשים הבא מציג את המחלקה שנוצרה עבור record Author (String name, String topic) {}:

Javap Records Java 14

המשמעות של רשומות דומה ל־Data Classes בקוטלין

בנוסף, אנו יכולים להוסיף שדות נוספים, שיטות, ובנאי לרשומה באופן הבא:

record Author (int id, String name, String topic) {
    static int followers;

    public static String followerCount() {
        return "Followers are "+ followers;
    }

    public String description(){
        return "Author "+ name + " writes on "+ topic;
    }

    public Author{
    if (id < 0) {
        throw new IllegalArgumentException( "id must be greater than 0.");
     }
   }
}

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

A compact constructor wouldn’t be generated as a separate constructor by the compiler. Instead, it is used for validation cases and would be invoked at the start of the main constructor.

כמה דברים חשובים לשים לב אליהם בנוגע לרשומות:

  • A record can neither extend a class nor it can be extended by another class. It’s a final class.
  • רשומות לא יכולות להיות מופשטות
  • רשומות לא יכולות להרחיב כל מחלקה אחרת ולא יכולות להגדיר שדות אינסטנס בתוך הגוף. שדות אינסטנס חייבים להיות מוגדרים רק בתיאור המצב בלבד
  • שדות המוגדרות הם פרטיים וסופיים
  • הגוף של רשומה מאפשר שדות ושיטות סטטיים

קריאה מומלצת: רשומות ג'אווה

4.1) הערכים בתוך שדות ההפניה של רשומה יכולים להיות מושתנים

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

Java 14 Records Mutable Values For References

4.2) רשומות יכולות ליישם ממשקים

הקוד הבא מציג דוגמה ליישום של ממשק עם רשומות:

record Author(String name, String topic) implements Information {
  public String getFullName() {
    return "Author "+ name + " writes on " + topic;
  }
}

interface Information {
  String getFullName();
}

זהו הפלט של הקוד למעלה בפעולה ב-JShell:

Java 14 Records With Interface

4.3) רשומות תומכות בבנאי מרובה

רשומות מאפשרות להגדיר בנאים מרובים עם או בלי פרמטרים כפי שמוצג למטה:

record Author(String name, String topic) {
  public Author() {

    this("NA", "NA");
  }

  public Author(String name) {

    this(name, "NA");
  }
}

4.4) רשומות מאפשרות שינוי בקובץ הגישה של השיטות

אף על פי שרשומות יוצרות באופן אוטומטי שיטות גישה ציבוריות לשדות שמוגדרים בתיאור המצב, הן גם מאפשרות לך להגדיר מחדש את שיטות הגישה בגוף הקוד, כפי שמוצג למטה:

record Author(String name, String topic) {
  public String name() {
        return "This article was written by " + this.name;
    }
}

4.5) בדיקת רשומה ורכיביה בזמן ריצה

רשומות מספקות לנו את isRecord() ואת getRecordComponents() לבדיקה האם המחלקה היא רשומה וגם לבדיקה של השדות והסוגים שלה. ההדגמה הבאה מראה איך זה נעשה:

Java 14 Records Runtime Check

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

5. קטעי טקסט (תצוגה מקדימה)

בלוקי טקסט נוכחו כתכונה מקדימה ב-Java 13 עם המטרה לאפשר יצירת ליטרלי טקסט בקווים רבים בצורה קלה. זה שימושי ביצירת מחרוזות HTML ו-JSON או מחרוזות שאילתות SQL בצורה פשוטה.

ב-Java 14, בלוקי טקסט עדיין בשלב התצורה המקדימה עם הוספות חדשות. כעת אנו יכולים להשתמש:

  • Backslash כדי להציג בצורה יפה בלוקי טקסט במספר שורות.
  • \s משמש להתחשב ברווחים שלאחריהם ברירת המחדל של המהדר תתעלם. זה שומר על כל הרווחים הנמצאים לפניו.
String text = """
                Did you know \
                Java 14 \
                has the most features among\
                all non-LTS versions so far\
                """;

String text2 = """
                line1
                line2 \s
                line3
                """;


String text3 = "line1\nline2 \nline3\n"

//טקסט2 וטקסט3 שווים.

הפניות: OpenJDK 14

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