JavaRush /Java блог /Random UA /Нова Java… Знову… Зустрічаємо Java 10

Нова Java… Знову… Зустрічаємо Java 10

Стаття з групи Random UA
Це раніше розробники чекали на нову Java по кілька років, хто — з жахом, а хто і з надією. Часи змінабося, і нові версії JDK радуватимуть нас раз на півроку. Якщо вам поки що неясно, до чого це приведе, ознайомтеся з думкою експерта , а тут ми перерахуємо основні зміни в Java 10 - найновішої версії нашої з вами улюбленої мови. Нова Java… Знову… Зустрічаємо Java 10 - 1У квадратних дужках перед новою фічею вказаний номер JEP, тобто JDK Enchancement Proposal. JEP – це пропозиція щодо покращення OpenJDK, яку можуть затвердити, відкласти або відхаботи. Тобто, по суті, збірка JEP'ів є стратегією розвитку OpenJDK.

Важливі фічі Java 10

[286] Local-Variable Type Inference - пропозиція щодо введення в Java ключового слова var, що позбавляє необхідності вказувати тип локальної змінної явно. Тобто тепер ви можете не вказувати тип проініціалізованої змінної, а писати щось на кшталт:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
Це усуває дублювання визначення типу ArrayList <>, яке нам довелося б використовувати раніше. Цікаво відзначити, що var не стає ключовим словом, а є типом, що зарезервований. Тобто ви можете використовувати var як ім'я змінної, метод або пакет. А ось назвати так клас ви не зможете (яка втрата!). [296] Об'єднання «лісу» JDK в єдиний репозиторій . У JDK 9 є вісім репозиторіїв - root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. У Java 10 весь цей ліс об'єднають у єдиний репозиторій, щоб з'явилася можливість виконувати атомарні коміти у взаємозалежних репозиторіях наборів змін. [304] Garbage-Collector Interface— це не інтерфейс, який може бути використаний розробниками для керування збиранням сміття. Натомість ми отримуємо чистий інтерфейс збирача сміття у вихідному коді 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 та зменшує обсяг ресурсів, коли кілька JVM працюють на одній фізичній чи віртуальній машині, починаючи з п'ятої версії. Але раніше використання CDS обмежувалося лише завантажувачем bootstrap. Тепер розширена версія під назвою Application CDS дозволяє завантажувати спеціальні архіви з класами та іншим завантажувачам. [312] Thread-Local Handshakes - досить низькорівнева зміна всередині JVM, яка дозволить виконувати зворотний виклик потоками без виконання глобальної точки безпеки VM. Це дозволить без зайвих витрат зупиняти окремі потоки, а не всі одразу (або жодного). [313] Remove the Native-Header Generation Tool (javah) . Ще в Java 9 розробники мови почали активно прибирати непотрібні інструменти, і JEP 313 продовжує це добре. Інструмент javah генерує JNI-header'и, якщо код має native-методи. Корисно? Звичайно, але рідний компілятор javac, починаючи з JDK 8, сам вміє генерувати JNI-header'и. Так що від javah тепер вирішабо позбутися. До речі, зараз ведуться розробки проекту Panama , який, зокрема, може замінити JNI. [314] Additional Unicode Language-Tag Extensions дана зміна покликана покращити клас java.util.Locale і пов'язані з ним API для реалізації додаткових розширень Unicode тегів мови BCP 47. Зокрема, тепер підтримуватимуться теги для типу валюти (cu), першого дня тижня (fw), перевизначення регіону (rg) та часового поясу (tz). [316] Heap Allocation on Alternative Memory Devices це нововведення допоможе тим, хто використовує інші, відмінні від DRAM, типи пам'яті. Оскільки технології постійно змінюються, то використання енергонезалежної пам'яті з тим самим інтерфейсом і подібними до DRAM характеристиками продуктивності — об'єктивна реальність на сьогоднішній день. Отже, JEP 316 дозволяє JVM розміщувати купу (heap) в інших типах пам'яті. [317] Experimental Java-Based JIT Compiler . Нещодавно було анонсовано проект Metropolis, в якому пропонується переписати більшу частину JVM на Java. Якщо ви не знали, поточна версія написана на C++. Ну а якщо ви вже в курсі, мабуть, у перший момент подібна ідея видасться вам дивною. Якщо JVM написана на Java, хіба вам не знадобиться JVM для запуску JVM? Така ось рекурсія, що нагадує про дзеркала навпроти один одного. Однак насправді все трохи інакше: якщо JVM написана на Java, це не означає, що ви повинні скомпілювати її в байт-коди. Насправді можна використовувати AOT-компіляцію, а потім JIT компілює код, оскільки він працює для підвищення продуктивності.

Для компіляції Java коду зазвичай використовується такий інструмент, як javac. Він перетворює програму на Java на набір клас-файлів із байт-кодами. Далі JVM запускає ваш байт-код і її інтерпретатор перетворює в інструкції процесора. Окрім інтерпретатора, у JVM є і вбудований компілятор, і він також може створити інструкції для процесора з байт-коду. Це так звана runtime compilation, компіляція під час запуску. Зазвичай такий компіляції піддають той код, який найчастіше використовувати це покращує продуктивність.

Компілятор може виконувати дії по-різному: JIT-компіляція (just-in-time) - динамічна, безпосередньо під час виконання програми або AOT-компіляція (ahead-of-time) - перед виконанням.

AOT-компілятор jaotc з'явився в JDK 9. В даний час Hotspot JVM містить два JIT-компілятори, C1 (для швидкості) та C2 (для оптимізації).

JEP 317 представляє проект досліджень Graal – компілятора для JDK. Це якийсь базис, який допоможе реалізувати Metropolis реальністю та дати можливість JVM відповідати (а краще – перевершити) за продуктивністю поточну версію, написану на C++. [319] Root Certificates – набір стандартних сертифікатів Certification Authority (CA) за замовчуванням у JDK. Тепер у збірках OpenJDK критичні компоненти безпеки, такі як TLS, працюватимуть за замовчуванням. Це корисне доповнення, швидше за все, стосується тих дій Oracle, які компанія робить, щоб гарантувати, що двійкові файли OpenJDK та двійкові файли Oracle JDK функціонально однакові. [322] Time-Based Release Versioning— у Java 10 Feature releases додаватимуться нові фічі, а в 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

До стандартних бібліотек класів JDK 10 додано 73 доповнення.
  • java.awt.Toolkit

    int getMenuShortcutKeyMaskEx (): визначає, який розширений ключ-модифікатор є відповідним ключем прискорювача меню ярликів.

  • java.awt.geom.Path2D:

    void trimToSize (): Обрізає ємність цього екземпляра Path2Dдо його поточного розміру. Програма може використовувати цю операцію для мінімізації зберігання шляху. Той самий метод доданий у внутрішні класи Path2D.Doubleі Path2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): перевантажений 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:

  • String getDescriptor():

    повертає дескриптор методу, представленого цим кадром стека, як визначено специфікацією віртуальної машини Java.

  • String getMethodType ():

    повертає MethodType, що представляє типи параметрів, і тип значення, що повертається для методу, представленого фреймом стека.

  • java.lang.invoke.MethodType:

    Class <?> LastParameterType(): повертає останній тип параметра цього типу методу. Якщо цей тип немає параметрів, замість нього повертається значення 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:

    обидва ці класи отримали нові перевантажені методи розкодування та кодування, які використовують charsetяк додатковий параметр.

  • java.nio.channels.Channels:

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

  • java.nio.file.FileStore:

    long getBlockSize (): повертає кількість байтів на блок цього сховища файлів.

  • java.time.chrono:

    три класи в цьому пакеті, HijrahEra, MiinguoEraі ThaiBuddhistEra, отримали метод String getDisplayName (TextStyle, Locale). Він повертає текстове ім'я, що використовується для ідентифікації епохи, що підходить для представлення користувачеві.

  • java.time.format.DateTimeFormatter:

    localizedBy (Locale): повертає копію цього формату з локалізованими значеннями мови, календаря, регіону, десяткового стилю та/або часового поясу, які замінюють значення в цьому форматі.

  • java.util:

    DoubleSummaryStatistics, IntSummaryStatisticsі LongSummaryStatisticsотримали новий конструктор, який набуває чотирьох числових значень. Він створює непустий екземпляр із зазначеним лічильником, мінімумом, максимумом та сумою.

  • java.util.List, java.util.Map та java.util.Set:

    кожен із цих інтерфейсів обзавівся новим статичним методом copyOf (Collection). Вони повертають незмінні List, Mapабо Setмістять елементи даної колекції, у своєму порядку ітерації.

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

    кожен із цих класів отримує новий метод orElseThrow (), який сутнісно робить те саме, як і get (), тобто якщо умова виконується, значення повертається. В іншому випадку генерується виняток NoSuchElementException.

  • java.util.Formatter та java.util.Scanner:

    Обидва ці класи отримали три нових конструктори, які на вхід отримують charsetна додаток до інших аргументів.

  • java.util.Properties:

    Тут з'явився новий конструктор, який приймає аргумент int. Це створює порожній список властивостей без значень за замовчуванням і початковим розміром, що містить вказану кількість елементів без необхідності динамічної зміни розміру. Також з'явилася нова, перевантажена версія методу replace, яка приймає три параметри Objectта повертає логічне значення.

  • java.SplittableRandom:

    void nextBytes (byte []): заповнює наданий користувачем масив байтів з псевдовипадковими байтами, що генеруються.

  • java.util.concurrent.FutureTask:

    додано метод toString (), який повертає рядок, що ідентифікує FutureTask, а також стан завершення. Стан (у дужках) містить один із рядків: "Completed Normally" (нормальне завершення), "Completed Exceptionally" (завершення з винятком), "Cancelled" (скасовано) або "Not completed" (не завершено).

  • java.util.concurrent.locks.StampedLock:

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

  • java.jar.JarEntry:

    String getRealName (): повертає справжнє ім'я JarEntryцього Якщо JarEntryє записом мультирелізного jar-файлу, налаштованого для обробки, тоді ім'я, яке повертається цим методом, — ім'я шляху версії, яку представляє JarEntry. Інакше JarEntryповертає те саме ім'я, що і ZipEntry.getName ().

  • java.util.jar.JarFile:

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

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): повертає локалізоване ім'я для цього Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): повертає локалізоване ім'я для цього 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): повертає мінімальний розмір зазначеного компонента, що підходить для зовнішнього вигляду.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ