JavaRush /Java блогу /Random-KY /Жаңы Java... Дагы... Java 10 менен таанышыңыз

Жаңы Java... Дагы... Java 10 менен таанышыңыз

Группада жарыяланган
Буга чейин иштеп чыгуучулар жаңы Javaны бир нече жыл күтүшкөн, айрымдары үрөй учурган, кээ бири үмүт менен. Заман өзгөрдү, жана JDK жаңы versionлары бизди ар бир алты ай сайын кубандырат. Эгер бул эмнеге алып келери сизге азырынча түшүнүксүз болсо, эксперттин пикирин карап көрүңүз , жана бул жерде биз сүйүктүү тorбиздин эң жаңы versionсы болгон Java 10догу негизги өзгөртүүлөрдү тизмелейбиз. Жаңы Java... Дагы... Java 10 - 1 менен таанышыңызЖаңы "функциянын" алдында чарчы кашаанын ичинде JEP номери көрсөтүлөт, башкача айтканда, "JDK Enchancement Proposal". JEP OpenJDK жакшыртуу сунушу жана бекитorши, кечиктирorши же четке кагылышы мүмкүн. Башкача айтканда, 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<String> түрүнүн аныктамасынын кайталанышын жокко чыгарат, биз буга чейин колдонушубуз керек болчу. Кызыгы, var ачкыч сөз болуп калbyte, бирок сакталган түр. Башкача айтканда, өзгөрмөнүн, ыкманын же пакеттин аты катары var колдоно аласыз. Бирок сиз классты ушундай деп атай албайсыз (кандай жоготуу!). [296] JDK токойун бирдиктүү репозиторийге бириктирүү . JDK 9да сегиз репозиторий бар - root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. Java 10до бул токой бир репозиторийге бириктирилет, бул өз ара көз каранды өзгөрүүлөр топтомдорунун репозиторийлери боюнча атомдук тапшырмаларды аткарууга мүмкүндүк берет. [304] Таштанды жыйноочу интерфейси таштанды чогултууну көзөмөлдөө үчүн иштеп чыгуучулар тарабынан колдонула турган интерфейс эмес. Анын ордуна, биз JVM булак codeунан таза таштанды жыйноочу интерфейсин алабыз, бул сизге альтернативалуу коллекционерлерди тез жана оңой интеграциялоого мүмкүндүк берет. JVMге өзүнүн таштанды жыйноочусун кошууну кыялдангандар бул жакшыртууга абдан ыраазы болушат. [307] G1 таштанды жыйноочу үчүн параллелдүү толук GC . JDK 9да G1 демейки таштанды жыйноочу болуп калды, ал эми мурда демейки таштанды жыйноочу бир нече жип боюнча таштанды чогулта алган Parallel GC болчу. Эми G1 муну да жасай алат; мурда ал бир жипте жасаган, бул кээде кыйынчылыктарды жаратчу. XX:ParallelGCThreads. Айтмакчы, иштеп чыгуучулар жиптердин санын - [310] Колдонмо классы-берorштерди бөлүшүү параметри аркылуу конфигурациялай алышат - Java 10до кабыл алынган бул иштеп чыгуу, жакшыртылган жүктөөнү жана көз салууну сунуштайт, учурдагы класстарды бөлүшүү (CDS) өзгөчөлүгүн кеңейтет. колдонмо класстарын жалпы архивде жайгаштырууга уруксат берүү. Class-Data Sharing же *класстын кеңейтorши бар файлдар менен кыска иштөө үчүн CDS. Бул функция класстардын белгилүү бир бөлүгүн тандоого, аларды иштетүүгө жана атайын архивге кысууга мүмкүндүк берет. Мунун баары эстутумду сактоо үчүн жасалат. Көп учурда JVMдин ар кандай инстанциялары стандарттык китепканага киргизилген бир эле класстарды жүктөйт. Жана CDS бардык JVM инстанцияларына бир архивди андагы класстар менен бөлүшүүгө мүмкүндүк берет. Бул программаны жүктөө убактысын жана эстутумду колдонууну азайтат. Чындыгында, CDS JVM баштоонун натыйжалуулугун жакшыртат жана 5 versionсынан баштап бир нече JVM бир эле физикалык же виртуалдык машинада иштеп жатканда ресурстун изин азайтат. Бирок мурда CDSти колдонуу жүктөөчү жүктөөчү менен гана чектелген. Эми Application CDS деп аталган кеңейтилген versionсы башка жүктөгүчтөр үчүн класстар менен атайын архивдерди жүктөөгө мүмкүндүк берет. [312] Thread-Local Handshakes - бул JVM ичиндеги кыйла төмөн деңгээлдеги өзгөрүү, ал кайра чалууларды глобалдык VM коопсуздук чекити иштетилбестен жиптер боюнча аткарууга мүмкүндүк берет. Бул бир эле учурда (же такыр жок) эмес, жеке жиптерди чыгымсыз токтотууга мүмкүндүк берет. [313] Түпкү аталышты түзүү куралын (javah) алып салыңыз . Кайра Java 9да, тилди иштеп чыгуучулар керексиз куралдарды активдүү түрдө жок кыла башташты жана JEP 313 бул жакшы ишти улантууда. Эгерде codeдо жергorктүү ыкмалар бар болсо, javah куралы JNI аталыштарын жаратат. Ден соолук? Албетте, бирок JDK 8ден баштап жергorктүү javac компилятору өзү JNI аталыштарын түзө алат. Ошентип, азыр алар жавадан кутулууну чечишти. Айтмакчы, Панама долбоору учурда иштелип жатат , ал, атап айтканда, JNI алмаштыра алат. [314] Кошумча Юниcode тил-тег кеңейтүүлөрү Бул өзгөртүү BCP 47 тил тэгдерине кошумча Юниcode кеңейтүүлөрүн ишке ашыруу үчүн java.util.Locale классын жана аны менен байланышкан API'лерди өркүндөтүүгө багытталган. Атап айтканда, валюта түрүнүн тегдери (cu), биринчи күнү эми апта (fw), аймак (rg) жана убакыт алкагы (tz) жокко чыгарылат. [316] Альтернативдик эстутум түзүлүштөрүндө үймөктөрдү бөлүштүрүү Бул инновация DRAMдан башка эс тутум түрлөрүн колдонгондорго жардам берет. Технологиялар тынымсыз өзгөрүп тургандыктан, DRAMга окшош интерфейс жана иштөө мүнөздөмөлөрү менен өзгөрүлбөгөн эстутумду колдонуу бүгүнкү күндө an objectивдүү чындык. Ошентип, JEP 316 JVMге эстутумдун башка түрлөрүнө үймөк коюуга мүмкүндүк берет. [317] Эксперименталдык Java негизиндеги JIT компилятору . Метрополис долбоору жакында жарыяланды, ал Javaдагы JVMтин көбүн кайра жазууну сунуш кылат. Эгер сиз билбесеңиз, учурдагы version C++ тorнде жазылган. Ооба, эгер сиз буга чейин эле билсеңиз, балким, башында мындай идея сизге кызыктай көрүнөт. JVM Java тorнде жазылгандыктан, JVMди иштетүү үчүн сизге JVM керек эмеспи? Бири-бирине карама-каршы турган күзгүлөрдү эске салган рекурсия ушундай. Бирок, чындык бир аз башкача: JVM Java тorнде жазылгандыктан, бул аны byte codeдоруна компиляциялоо керек дегенди билдирбейт. Сиз чындыгында AOT компиляциясын колдонсоңуз болот, андан кийин JIT codeду түзөт, анткени ал натыйжалуулукту жакшыртуу үчүн иштейт.

Java codeун компиляциялоо үчүн көбүнчө javac сыяктуу курал колдонулат. Ал Java программасын byte codeдору бар класстык файлдардын жыйындысына айлантат. Андан кийин, JVM сиздин byte codeуңузду иштетет жана анын котормочусу аларды процессордун нускамаларына айландырат. Котормочудан тышкары, JVM да орнотулган компиляторго ээ жана ал byte codeдон процессор үчүн нускамаларды да түзө алат. Бул ишке киргизүү учурунда компиляция деп аталган Runtime компиляциясы. Адатта, эң көп колдонулган code мындай компиляцияга дуушар болот - бул иштин натыйжалуулугун жакшыртат.

Компилятор иш-аракеттерди ар кандай жолдор менен аткара алат: JIT компиляциясы (убакытында) - динамикалык, программаны аткаруу учурунда же AOT компиляциясы (убакыттан мурун) - аткарууга чейин.

jaotc AOT компилятору JDK 9да киргизилген. Учурда Hotspot JVM эки JIT компиляторун камтыйт, C1 (тездик үчүн) жана C2 (оптималдаштыруу үчүн).

JEP 317 JDK үчүн компилятор болгон Graal изилдөө долбоорун сунуштайт. Бул Metropolisти реалдуу кылууга жардам бере турган белгилүү бир негиз жана JVMге C++ тorнде жазылган учурдагы versionга дал келүүгө (же андан да жакшысы, андан ашууга) мүмкүнчүлүк берет. [319] Түпкү сертификаттар - JDKдагы стандарттуу Тастыктоо Органынын (CA) сертификаттарынын демейки топтому. TLS сыяктуу критикалык коопсуздук компоненттери эми OpenJDK түзүмдөрүндө демейки боюнча иштейт. Бул пайдалуу кошумча Oracle OpenJDK бинардык жана Oracle JDK экorк файлдары функционалдык жактан бирдей болушун камсыз кылуу үчүн жасап жаткан ишинин бир бөлүгү болсо керек. [322] Убакыттын негизинде релиз versionсы - Java 10до Функциянын релиздерине жаңы функциялар кошулат жана Жаңыртуу релиздеринде мүчүлүштүктөр оңдолот. Негизи бизде JDK versionсынын сап форматтарын орнотуунун жаңы жолу бар. Бул JDK 9 менен бир топ кызыктай кырдаалды оңдойт. Биринчи жаңыртуу JDK 9.0.1 болгон, бул абдан логикалуу. Экинчи жаңыртуу JDK 9.0.4, бул логикага туура келбейт. Логика JDK 9 versionсынын номерлөө схемасынын ичинде өзгөчө кырдаалда, пландаштырылбаган жаңыртуу учурунда жаңыртуулардын ортосунда бош орун калат. Жаңыртуу талап кылынбагандыктан, эмне үчүн аны JDK 9.0.2 деп атаганга болбойт? Жана бул жерде жаңы Java version форматы кандай болот:
[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, белгиленген codeдоону колдонуу менен byteтарды чечмелөө аркылуу буфердин мазмунун сапка айлантат.

  • java.io.PrintStream жана lang.io.PrintWriter:

    Бул эки класста тең кошумча аргумент алган үч жаңы конструктор бар charset.

  • java.io.Reader:

    long transferTo (Writer): Бул окурмандын бардык каармандарын окуйт жана берилген жазуучуга каармандарды окуу тартиби боюнча жазат.

  • java.lang.Runtime.Version:

    Сап талааларынын жаңы versionсы (JEP 322) үчүн бүтүн санды кайтаруучу төрт жаңы ыкма: feature (), interim (), patch ()жана update ().

  • java.lang.StackWalker.StackFrame:

  • getDescriptor() саптары:

    Java Virtual Machine Specification тарабынан аныкталгандай, бул стек алкагы менен көрсөтүлгөн методго тутканы кайтарат.

  • String getMethodType():

    кайтаруу 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