לאחר שישה חודשים של פיתוח, אורקל פרסמה את פלטפורמת Java SE 23 (Java Platform, Standard Edition 23), המשתמשת בפרויקט OpenJDK בקוד פתוח כיישום ייחוס. למעט הסרה של כמה תכונות מיושנות, Java SE 23 שומר על תאימות לאחור עם מהדורות קודמות של פלטפורמת Java - רוב פרויקטי ה-Java שנכתבו בעבר יעבדו ללא שינויים כאשר הם פועלים תחת הגרסה החדשה. בנייה מוכנה להתקנה של Java SE 22 (JDK, JRE ו-Server JRE) מוכנות עבור Linux (x86_64, AArch64), Windows (x86_64) ו-macOS (x86_64, AArch64). מימוש ההתייחסות של Java 23, שפותח על ידי פרויקט OpenJDK, הוא קוד פתוח לחלוטין תחת רישיון GPLv2, עם חריגים של GNU ClassPath המאפשרים קישור דינמי עם מוצרים מסחריים.
Java SE 23 מסווגת כגרסת תמיכה רגילה ותמשיך לקבל עדכונים עד המהדורה הבאה. ענף התמיכה לטווח ארוך (LTS) צריך להיות Java SE 21 או Java SE 17, אשר יקבלו עדכונים עד 2031 ו-2029, בהתאמה (זמין בדרך כלל עד 2028 ו-2026). תמיכה מורחבת בענף LTS של Java SE 8 תימשך עד 2030, ו-Java SE 11 עד 2032.
בין 23 החידושים המוצעים ב-Java SE:
- מצב הפעולה הגנרטיבי של אוסף האשפה ZGC (Generation Z Garbage Collector) מופעל כברירת מחדל, תוך שימוש בעיבוד נפרד של חפצים "ישנים" ו"צעירים", מה שמגביר את היעילות של ניקוי חפצים שנוצרו לאחרונה עם אורך חיים קצר. שימוש ב-Generational ZGC מפחית את הסיכון לתיקונים במהלך הקצאת משאבים, מקטין את עומס המעבד וצריכת הזיכרון במהלך איסוף האשפה. בדיקת Generational ZGC עם Apache Cassandra 4 הראתה עלייה של פי 4 בתפוקה עם גודל ערימה קבוע ורבע הפחתה בגודל ערימה עם תפוקה קבועה.
- JavaDoc הוסיפה תמיכה בשימוש ב-Markdown כדי לתעד קוד בהערות, שניתן להשתמש בהן במקום תערובת של תגי HTML ו-JavaDoc @.

- מנגנוני התאמת דפוסים שופרו עם תמיכה ראשונית בשימוש בטיפוסים פרימיטיביים (int, byte, char וסוגים בסיסיים אחרים שאינם אובייקטים) בכל מיני תבניות, בהצהרת "instanceof" ובבלוקים "switch". switch (x.getStatus()) { מקרה 0 -> "בסדר"; מקרה 1 -> "אזהרה"; מקרה 2 -> "שגיאה"; case int i -> "מצב לא ידוע: " + i; } if (i instanceof byte b) { … b … }
- נוספה תמיכה ראשונית לשימוש במשפט "ייבוא מודול M" יחיד כדי לייבא את כל החבילות המיוצאות על ידי מודול מוגדר בבת אחת. השינוי מפשט משמעותית את השימוש החוזר בספריות מודולריות, ומאפשר לכלול ספריות ומחלקות מבלי לקבוע את מקומן בהיררכיית החבילות. לדוגמה, ציון "ייבוא מודול java.base" ייבא את כל 54 החבילות הכלולות במודול java.base, אשר בעבר היה צריך להזכיר בנפרד ("import java.io.*", "import java.util.* " וכו').
יישום ראשוני שני של ה-Class-File API מוצע לניתוח, יצירה והמרה של קבצי מחלקות Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce);
- התצוגה המקדימה השמינית של ה-Vector API מספקת פונקציות לחישובים וקטוריים המבוצעים באמצעות הוראות וקטוריות במעבדי x86_64 ו-AArch64 ומאפשרות להחיל פעולות בו-זמנית על מספר ערכים (SIMD). בניגוד ליכולות הניתנות במהדר HotSpot JIT עבור וקטוריזציה אוטומטית של פעולות סקלריות, ה-API החדש מאפשר לשלוט בצורה מפורשת ב-Vectorization עבור עיבוד נתונים מקבילי.
- נוספו שיטות פורמט, printf, readPassword ו-readLine למחלקה java.io.Console כדי לעצב, להציג ולקרוא טקסט על סמך המקום שנבחר. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024-mai-16 jeudi
- נוספה יישום תצוגה מקדימה שנייה של ה-API המורחב של Stream התומך בהגדרת פעולות ביניים משלך, מה שעשוי להיות שימושי במקרים שבהם פעולות ביניים מובנות קיימות אינן מספיקות לשינוי הנתונים הרצוי. מטפלים מקומיים מחוברים באמצעות פעולת הביניים החדשה Stream::gather(Gatherer), המעבדת רכיבי זרימה על ידי החלת מטפל שצוין על ידי המשתמש עליהם. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- הוספה יישום ראשוני שלישי של מחלקות שהוכרזו במרומז ומופעים ללא שם של שיטת ה"ראשית", שיכולה לוותר על הצהרות ציבוריות/סטטיות, העברת מערך של טיעונים וישויות אחרות הקשורות להצהרת מחלקה. // היה מחלקה ציבורית HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // עכשיו אתה יכול לבטל את main() { System.out.println("Hello, World!"); }
- נוספה תצוגה מקדימה שנייה של תכונה המאפשרת לבנאים לציין ביטויים לפני קריאה לסופר(...), המשמשת לקריאה מפורשת לבנאי מחלקה אב מבנאי מחלקה שעברה בירושה אם ביטויים אלו אינם מתייחסים למופע שנוצר על ידי הבנאי. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); סוּפֶּר(); } } }
- הוסף יישום תצוגה מקדימה שלישית של Scoped Values, המאפשר שיתוף נתונים בלתי ניתנים לשינוי בין שרשורים והחלפת נתונים ביעילות בין שרשורי צאצא (ערכים עוברים בירושה). ערכים בהיקף מפותחים כדי להחליף את מנגנון המשתנים המקומיים של השרשור והם יעילים יותר בעת שימוש במספרים גדולים מאוד של שרשורים וירטואליים (אלפי או מיליוני שרשורים). ההבדל העיקרי בין ערכים בהיקף למשתנים מקומיים הוא שהראשונים נכתבים פעם אחת, לא ניתנים לשינוי בעתיד, ונשארים זמינים רק למשך ביצוע השרשור.
- תצוגה מקדימה שלישית של ה-Structured Concurrency API הוצעה לבדיקה, המפשטת את הפיתוח של יישומים מרובים על ידי עיבוד משימות מרובות הפועלות בשרשורים שונים כבלוק יחיד.
- שיטות הגישה לזיכרון החיצוני (מחוץ ל-JVM) שסופקו על ידי המחלקה sun.misc.Unsafe הוצאו משימוש ותוזמנו להסרה. כדי לגשת לזיכרון מחוץ לערמה ולקיים אינטראקציה עם קוד חיצוני, מומלץ להשתמש ב-VarHandle API וב-FFM (Foreign Function & Memory) API.
בנוסף, אנו יכולים לציין את פרסום עדכון לפלטפורמה ליצירת יישומים עם הממשק הגרפי JavaFX 23 והכללת המהדר GraalVM JIT ב-Oracle JDK 23 הראשי.
כמו כן מוצגת מהדורה חדשה של המכונה הוירטואלית האוניברסלית GraalVM, התומכת בהפעלת יישומים ב-JavaScript (Node.js), Python, Ruby, R, כל השפות עבור ה-JVM (Java, Scala, Clojure, Kotlin) ושפות שעבורו ניתן להפיק LLVM bitcode (C, C++, Rust). בנוסף לתמיכה ב-JDK 23, הגרסה החדשה מייעלת את צריכת הזיכרון ואת גודל קוד ההפעלה, ומספקת תמיכה מלאה בכלים להטמעת Python ו-WebAssembly בקוד Java באמצעות הידור JIT.
מקור: OpenNet.ru

