JavaRush /בלוג Java /Random-HE /Java חדש... שוב... הכירו את Java 10

Java חדש... שוב... הכירו את Java 10

פורסם בקבוצה
בעבר, מפתחים חיכו לג'אווה חדשה במשך כמה שנים, חלקם באימה וחלקם בתקווה. הזמנים השתנו, וגרסאות חדשות של JDK ישמחו אותנו כל שישה חודשים. אם עדיין לא ברור לך למה זה יוביל, בדוק את חוות דעתו של המומחה , וכאן נפרט את השינויים העיקריים ב-Java 10, הגרסה החדשה ביותר של השפה האהובה עלינו. ג'אווה חדשה... שוב... הכירו את Java 10 - 1בסוגריים מרובעים לפני ה"תכונה" החדשה מצוין מספר ה-JEP, כלומר, "הצעה לשיפור JDK". JEP היא הצעה לשיפור OpenJDK ועשויה להיות מאושרת, לעכב או לדחות. כלומר, בעצם, אוסף של JEPs הוא אסטרטגיית פיתוח עבור OpenJDK.

תכונות חשובות של Java 10

[286] מסקנות מסוג Local-Variable Type - הצעה להכנסת מילת המפתח var ל-Java, תוך ביטול הצורך לציין במפורש את הסוג של משתנה מקומי. כלומר, עכשיו אתה לא יכול לציין את סוג המשתנה המאותחל, אלא לכתוב משהו כמו:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
זה מבטל את הכפילות של הגדרת סוג ArrayList<String> שהיינו צריכים להשתמש בה קודם. מעניין לציין ש-var לא הופך למילת מפתח, אלא הוא סוג שמור. כלומר, אתה יכול להשתמש ב-var כשם של משתנה, שיטה או חבילה. אבל לא תוכל לכנות את הכיתה כך (איזה הפסד!). [296] מיזוג יער JDK למאגר יחיד . ל-JDK 9 יש שמונה מאגרים - root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. ב-Java 10, כל היער הזה ישולב למאגר אחד כדי לאפשר לבצע commits אטומיים על פני מאגרים של שינויים תלויים זה בזה. [304] ממשק אוסף האשפה אינו ממשק שיכול לשמש מפתחים כדי לשלוט באיסוף האשפה. במקום זאת, אנו מקבלים ממשק אספן אשפה נקי בקוד המקור של JVM, המאפשר לך לשלב במהירות ובקלות אספנים חלופיים. מי שחלם להוסיף אספן אשפה משלהם ל-JVM יהיה מרוצה ביותר מהשיפור הזה. [307] Parallel Full GC עבור אוסף האשפה G1 . ב-JDK 9, G1 הפך לאספן האשפה המוגדר כברירת מחדל, בעוד שבעבר אספן האשפה המוגדר כברירת מחדל היה Parallel GC, שיכול לאסוף אשפה על פני שרשורים מרובים. עכשיו גם G1 יכול לעשות את זה; בעבר הוא עשה את זה בשרשור אחד, מה שגרם לפעמים לקשיים. אגב, מפתחים יוכלו להגדיר את מספר השרשורים באמצעות הפרמטר - XX:ParallelGCThreads. [310] Application Class-Data Sharing - פיתוח זה, שאומץ ב-Java 10, מציע טעינה ומעקב משופרים, מרחיב את תכונת שיתוף הכיתה (CDS) הקיימת כדי לאפשר מיקום מחלקות יישומים בארכיון הכללי. Class-Data Sharing או CDS לעבודות קצרות עם קבצים עם סיומת *class. פונקציה זו מאפשרת לך לבחור תת-קבוצה מסוימת של מחלקות, לעבד אותן ולדחוס אותן לארכיון מיוחד. כל זה נעשה כדי לחסוך בזיכרון. לעתים קרובות מופעים שונים של ה-JVM טוענים את אותן מחלקות הכלולות בספרייה הסטנדרטית. ו-CDS מאפשר לכל מופעי ה-JVM הללו לשתף ארכיון בודד עם מחלקות המוצבות בו. זה מקטין הן את זמן טעינת התוכנית והן את השימוש בזיכרון. למעשה, CDS משפר את ביצועי האתחול של JVM ומפחית את טביעת הרגל של משאבים כאשר מספר JVMs פועלים על אותו מכונה פיזית או וירטואלית, החל מגרסה 5. אבל קודם לכן השימוש ב-CDS הוגבל לטעינת האתחול בלבד. כעת גרסה מורחבת בשם Application CDS מאפשרת לך לטעון ארכיונים מיוחדים עם מחלקות עבור מעמיסים אחרים. [312] Thread-Local Handshakes הוא שינוי ברמה נמוכה למדי בתוך ה-JVM שיאפשר לבצע התקשרויות חוזרות על פני שרשורים מבלי להפעיל נקודת בטיחות VM גלובלית. זה יאפשר לך לעצור ללא עלות שרשורים בודדים, ולא בבת אחת (או אף אחד בכלל). [313] הסר את הכלי ליצירת כותרות מקוריות (javah) . בחזרה ב-Java 9, מפתחי שפות החלו להסיר כלים מיותרים באופן פעיל, ו-JEP 313 ממשיך בעבודה הטובה הזו. כלי ה-javah יוצר כותרות JNI אם יש שיטות מקוריות בקוד. בָּרִיא? כמובן, אבל מהדר ה-javac המקורי, החל מ-JDK 8, יכול ליצור בעצמו כותרות JNI. אז עכשיו הם החליטו להיפטר מג'אווה. אגב, פרויקט פנמה נמצא כעת בפיתוח , שבמיוחד יכול להחליף את JNI. [314] הרחבות נוספות של Unicode Language-Tag שינוי זה נועד לשפר את המחלקה java.util.Locale וממשקי ה-API המשויכים להטמעת תוספי Unicode נוספים לתגי שפה BCP 47. בפרט, תגים עבור סוג המטבע (cu), היום הראשון כעת יתמכו בעקיפות בשבוע (fw), אזור (rg) ואזור זמן (tz). [316] הקצאת ערימה על התקני זיכרון חלופיים חידוש זה יעזור למי שמשתמש בסוגי זיכרון אחרים מלבד DRAM. מכיוון שהטכנולוגיות משתנות כל הזמן, השימוש בזיכרון לא נדיף עם אותו ממשק ומאפייני ביצועים הדומים ל-DRAM הוא מציאות אובייקטיבית כיום. אז, JEP 316 מאפשר ל-JVM למקם ערימה בסוגים אחרים של זיכרון. [317] מהדר JIT ניסיוני מבוסס Java . לאחרונה הוכרז פרויקט Metropolis, המציע לשכתב את רוב ה-JVM בג'אווה. למקרה שלא ידעתם, הגרסה הנוכחית כתובה ב-C++. ובכן, אם אתה כבר יודע, כנראה שבהתחלה רעיון כזה ייראה לך מוזר. מכיוון שה-JVM כתוב ב-Java, האם לא תזדקק ל-JVM כדי להפעיל את ה-JVM? כזו היא הרקורסיה, המזכירה מראות זו מול זו. עם זאת, המציאות קצת שונה: רק בגלל שה-JVM כתוב ב-Java, זה לא אומר שצריך להדר אותו לבייטקודים. למעשה אתה יכול להשתמש בקומפילציה של AOT ואז JIT מרכיב את הקוד כפי שהוא פועל לשיפור הביצועים.

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

המהדר יכול לבצע פעולות בדרכים שונות: קומפילציה של JIT (Just-in-Time) - דינמית, ממש בזמן הפעלת התוכנית, או קומפילציה של AOT (לפני הזמן) - לפני ביצוע.

מהדר jaotc AOT הוצג ב-JDK 9. נכון לעכשיו, ה-Hotspot JVM מכיל שני מהדרים של JIT, C1 (למהירות) ו-C2 (לאופטימיזציה).

JEP 317 מציג את פרויקט המחקר Graal, מהדר עבור JDK. זהו בסיס מסוים שיעזור להפוך את מטרופוליס למציאות ולאפשר ל-JVM להתאים (או יותר טוב, לחרוג) לגרסה הנוכחית שנכתבה ב-C++ בביצועים. [319] אישורי שורש הם ערכת ברירת המחדל של אישורי רשות האישורים (CA) הסטנדרטיים ב-JDK. רכיבי אבטחה קריטיים כגון TLS יפעלו כעת כברירת מחדל ב-Builds של OpenJDK. תוספת שימושית זו היא ככל הנראה חלק ממה שאורקל עושה כדי להבטיח שהקבצים הבינאריים של OpenJDK והבינאריים של Oracle JDK יהיו זהים מבחינה פונקציונלית. [322] גרסת גרסה מבוססת זמן - ב-Java 10, תכונות חדשות יתווספו למהדורות תכונות, ובאגים יתוקנו ב- Update Releases. בעיקרו של דבר, יש לנו דרך חדשה להגדיר פורמטים של מחרוזת גרסת JDK. זה מתקן מצב די מוזר עם JDK 9. העדכון הראשון היה JDK 9.0.1, וזה די הגיוני. העדכון השני הוא JDK 9.0.4, וזה לא הגיוני. ההיגיון הוא שבתוך סכימת המספור של גרסת JDK 9, נותר מקום בין העדכונים למקרה חירום, עדכון לא מתוכנן. מכיוון שהעדכון לא היה נחוץ, למה לא לקרוא לו JDK 9.0.2? וכך נראה הפורמט החדש של גרסת Java:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

ממשקי API חדשים

ישנן 73 תוספות לספריות המחלקות הסטנדרטיות של JDK 10.
  • ערכת הכלים java.awt

    int getMenuShortcutKeyMaskEx (): מגדיר איזה מקש שינוי מורחב הוא מקש האצה המתאים לתפריט הקיצור.

  • java.awt.geom.Path2D:

    void trimToSize (): חותך את הקיבולת של מופע זה Path2Dלגודלו הנוכחי. יישום יכול להשתמש בפעולה זו כדי למזער את אחסון הנתיב. אותה שיטה נוספה למחלקות הפנימיות Path2D.Doubleו- Path2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): overloaded toString, ממירה את התוכן של מאגר למחרוזת על ידי פענוח הבתים באמצעות הקידוד שצוין.

  • java.io.PrintStream ו-lang.io.PrintWriter:

    לשתי המחלקות הללו יש שלושה בנאים חדשים שלוקחים טיעון נוסף charset.

  • java.io.Reader:

    long transferTo (Writer): קורא את כל הדמויות מהקורא הזה וכותב את הדמויות לסופר הנתון לפי סדר הקריאה.

  • java.lang.Runtime.Version:

    ארבע שיטות חדשות המחזירות ערך שלם עבור הגרסה החדשה (JEP 322) של שדות המחרוזת: feature (), interim (), patch ()ו update ().

  • java.lang.StackWalker.StackFrame:

  • מחרוזת getDescriptor():

    מחזירה נקודת אחיזה למתודה המיוצגת על ידי מסגרת מחסנית זו, כפי שהוגדרה על ידי מפרט Java Virtual Machine.

  • מחרוזת getMethodType():

    returns MethodType, המייצגים את סוגי הפרמטרים וסוג ההחזרה עבור השיטה המיוצגת על ידי מסגרת המחסנית.

  • java.lang.invoke.MethodType:

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, instead of него возвращается meaning sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid () возвращает pid запущенной виртуальной машины Java.

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int): возвращает информацию о потоке для всех потоков в реальном времени с трассировкой стека с указанным максимальным количеством элементов и информацией о синхронизации.

  • ThreadInfo [] getThreadInfo (long [], boolean, boolean, int):

    возвращает информацию о потоке для каждого потока, чья идентификация находится во входном массиве, с трассировкой стека указанного максимального количества элементов и информацией о синхронизации.

  • java.lang.reflect.MalformedParameterizedTypeException:

    добавлен новый конструктор, который принимает подробное сообщение в виде строки в качестве параметра.

  • java.net.URLDecoder и java.net.URLEncoder:

    оба этих класса получor новые перегруженные методы расcodeирования и codeирования, которые используют charset в качестве дополнительного параметра.

  • java.nio.channels.Channels:

    Два новых статических перегруженных метода, newReader (ReadByteChannel, Charset) и newWriter (WriteByteChannel, Charset), которые позволяют использовать charset.

  • java.nio.file.FileStore:

    long getBlockSize (): возвращает количество byteов на блок в этом хранorще файлов.

  • java.time.chrono:

    три класса в этом пакете, HijrahEra, MiinguoEra и ThaiBuddhistEra, получor метод String getDisplayName (TextStyle, Locale). Он возвращает текстовое Name, используемое для идентификации эпохи, подходящее для представления пользователю.

  • java.time.format.DateTimeFormatter:

    localizedBy (Locale): возвращает копию этого форматтера с локализованными значениями языка, календаря, региона, десятичного стиля и / or часового пояса, которые заменяют значения в этом формате.

  • java.util:

    DoubleSummaryStatistics, IntSummaryStatistics и LongSummaryStatistics получor новый конструктор, который принимает четыре числовых значения. Он создает непустой экземпляр с указанным счетчиком, минимумом, максимумом и суммой.

  • java.util.List, java.util.Map и java.util.Set:

    каждый из этих интерфейсов обзавёлся новым статическим методом copyOf (Collection). Они возвращают неизменяемые List, Map or Set, содержащие элементы данной коллекции, в своем порядке итерации.

  • java.util.Optional, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong:

    каждый из этих классов получает новый метод orElseThrow (), который по существу делает то же самое, что и get (), то есть если condition выполняется, meaning возвращается. В противном случае генерируется исключение NoSuchElementException.

  • java.util.Formatter и java.util.Scanner:

    Оба этих класса получor три новых конструктора, которые на вход получают charset в дополнение к другим аргументам.

  • java.util.Properties:

    Здесь появился новый конструктор, который принимает аргумент int. Это создает пустой список свойств без значений по умолчанию и с начальным размером, содержащим указанное количество элементов без необходимости динамического изменения размера. Также появилась новая, перегруженная version метода replace, которая принимает три параметра Object и возвращает логическое meaning.

  • java.SplittableRandom:

    void nextBytes (byte []): заполняет предоставленный пользователем массив byteов с генерируемыми псевдослучайными byteами.

  • java.util.concurrent.FutureTask:

    добавлен метод toString (), который возвращает строку, идентифицирующую FutureTask, а также ее состояние завершения. Состояние (в скобках) содержит одну из строк: «Completed Normally» (нормальное завершение), «Completed Exceptionally» (завершение с исключением), «Cancelled» (отменено) or «Not completed» (не завершено).

  • java.util.concurrent.locks.StampedLock:

    новые методы boolean isLockStamp (long), boolean isOptimisticReadStamp (long), boolean isReadLockStamp (long) и boolean isWriteLockStamp (long).

  • java.jar.JarEntry:

    String getRealName (): возвращает настоящее Name этого JarEntry. Если JarEntry является записью мультирелизного jar-file, настроенного для обработки, тогда Name, возвращаемое этим методом — Name пути версии, которую представляет JarEntry. Иначе JarEntry возвращает то же Name, что и ZipEntry.getName ().

  • java.util.jar.JarFile:

    Stream <JarEntry> versionedStream (): возвращает поток записей в файле с версией jar. Подобно методу getRealName для JarEntry, связан с мультирелизными jar-fileми.

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Name для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Name для данного Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator) — эти четыре новых метода возвращают коллекторы (Collectors), которые накапливают входные элементы в соответствующую немодифицируемую коллекцию.

  • java.lang.model.SourceVersion:

    теперь это поле RELEASE_10 для представления версии JDK 10.

  • java.lang.model.util.TypeKindVisitor6 и javax.lang.model.util.TypeKindVisitor9:

    что-то не вполне понятное:).

  • R visitNoTypeAsModule (NoType, P):

    посещает псевдо-тип MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    У этого класса было добавлено два поля: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Представляете, Swing все еще обновляется!

  • ButtonGroup getGroup ():

    возвращает группу, к которой принадлежит кнопка. Обычно используется с radio buttons, которые являются взаимоисключающими в своей группе.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION