Важливі фічі 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 (для оптимізації). |
[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)
: повертає мінімальний розмір зазначеного компонента, що підходить для зовнішнього вигляду.