JavaRush /Java блогы /Random-KK /Жаңа Java... Тағы да... Java 10-мен танысыңыз

Жаңа Java... Тағы да... Java 10-мен танысыңыз

Топта жарияланған
Бұрын әзірлеушілер жаңа Java-ны бірнеше жыл күтті, кейбіреулері қорқынышпен, ал кейбіреулері үмітпен күтті. Уақыт өзгерді және JDK-ның жаңа нұсқалары жарты жыл сайын бізді қуантады. Егер бұл сізге не әкелетіні әлі түсініксіз болса, сарапшының пікірімен танысыңыз , және мұнда біз сүйікті тіліміздің ең жаңа нұсқасы Java 10-дағы негізгі өзгерістерді тізімдейміз. Жаңа Java... Тағы да... Java 10 - 1 нұсқасымен танысыңызЖаңа «мүмкіндік» алдында шаршы жақшада JEP нөмірі көрсетіледі, яғни «JDK Enchancement Proposal». JEP - OpenJDK жақсарту ұсынысы және мақұлдануы, кешіктірілуі немесе қабылданбауы мүмкін. Яғни, мәні бойынша JEP жинағы OpenJDK үшін даму стратегиясы болып табылады.

Java 10 маңызды мүмкіндіктері

[286] Жергілікті айнымалы түрі бойынша қорытынды - 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 жүйесінде бұл орман бір репозиторийге біріктіріліп, өзара тәуелді өзгерістер жиынтығының репозитарийлері бойынша атомдық тапсырмаларды орындауға мүмкіндік береді. [304] Қоқыс жинаушы интерфейсі қоқыс жинауды басқару үшін әзірлеушілер пайдалана алатын интерфейс емес. Оның орнына біз JVM бастапқы codeында таза қоқыс жинаушы интерфейсін аламыз, бұл сізге баламалы коллекторларды жылдам және оңай біріктіруге мүмкіндік береді. JVM-ге өздерінің қоқыс жинағышын қосуды армандағандар бұл жақсартуға өте риза болады. [307] G1 қоқыс жинағышына арналған параллельді толық GC . JDK 9 жүйесінде G1 әдепкі қоқыс жинағыш болды, ал бұрын әдепкі қоқыс жинағыш бірнеше ағындар арқылы қоқысты жинай алатын Parallel GC болды. Енді G1 мұны да жасай алады; бұрын ол бір ағында жасады, бұл кейде қиындықтар туғызды. XX:ParallelGCThreads. Айтпақшы, әзірлеушілер ағындар санын - [310] Application Class-Data Sharing параметрі арқылы конфигурациялай алады - Java 10-да қабылданған бұл әзірлеме жүктеу мен бақылауды жақсартады, бар Class Sharing (CDS) мүмкіндігін кеңейтеді. қолданбалы сыныптарды жалпы мұрағатта орналастыруға мүмкіндік беру. Class-Data Sharing немесе *class кеңейтімі бар файлдармен қысқа жұмыстарға арналған CDS. Бұл функция класстардың белгілі бір жиынын таңдауға, оларды өңдеуге және оларды арнайы мұрағатқа сығуға мүмкіндік береді. Мұның бәрі жадты сақтау үшін жасалады. Көбінесе JVM-дің әртүрлі даналары стандартты кітапханаға енгізілген бірдей сыныптарды жүктейді. Және CDS осы JVM даналарының барлығына бір мұрағатты онда орналасқан сыныптармен ортақ пайдалануға мүмкіндік береді. Бұл бағдарламаны жүктеу уақытын да, жадты пайдалануды да азайтады. Шындығында, CDS JVM іске қосу өнімділігін жақсартады және 5-нұсқадан бастап бірнеше JVM бір физикалық немесе виртуалды машинада жұмыс істеп тұрған кезде ресурс көлемін азайтады. Бірақ бұрын CDS пайдалану тек жүктеуші жүктегішпен шектелді. Енді Application CDS деп аталатын кеңейтілген нұсқасы басқа жүктеушілер үшін сыныптары бар арнайы мұрағаттарды жүктеуге мүмкіндік береді. [312] Thread-Local Handshakes – JVM ішіндегі айтарлықтай төмен деңгейлі өзгеріс, ол кері шақыруларды жаһандық VM қауіпсіздік нүктесін іске қоспай-ақ ағындар бойынша орындауға мүмкіндік береді. Бұл бір уақытта (немесе мүлде жоқ) емес, жеке ағындарды шығынсыз тоқтатуға мүмкіндік береді. [313] Негізгі тақырыпты жасау құралын (javah) жойыңыз . Java 9-да тіл әзірлеушілері қажетсіз құралдарды белсенді түрде жоюға кірісті және JEP 313 бұл жақсы жұмысты жалғастыруда. Егер codeта жергілікті әдістер болса, javah құралы JNI тақырыптарын жасайды. Сау ма? Әрине, бірақ JDK 8 бастап жергілікті 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-дің көп бөлігін қайта жазуды ұсынатын Metropolis жобасы жарияланды. Егер сіз білмесеңіз, ағымдағы нұсқа C++ тілінде жазылған. Егер сіз бұрыннан білетін болсаңыз, алдымен мұндай идея сізге оғаш болып көрінуі мүмкін. JVM Java тілінде жазылғандықтан, JVM іске қосу үшін сізге JVM қажет емес пе? Бір-біріне қарама-қарсы айналарды еске түсіретін рекурсия осындай. Дегенмен, шындық сәл басқаша: JVM Java тілінде жазылғандықтан, бұл оны byte codeтарына құрастыру керек дегенді білдірмейді. Сіз шын мәнінде AOT компиляциясын пайдалана аласыз, содан кейін JIT өнімділікті жақсарту үшін жұмыс істейтіндіктен codeты құрастырады.

Java codeын құрастыру үшін әдетте javac сияқты құрал қолданылады. Ол Java бағдарламасын byte codeтары бар класс файлдарының жинағына түрлендіреді. Содан кейін JVM сіздің byte codeыңызды іске қосады және оның аудармашысы оларды процессор нұсқауларына түрлендіреді. Интерпретатордан басқа, JVM-де кірістірілген компилятор да бар және ол сонымен қатар byte codeтан процессорға нұсқаулар жасай алады. Бұл іске қосу кезіндегі компиляция, орындау уақытының компиляциясы деп аталады. Әдетте жиі қолданылатын code осындай компиляцияға ұшырайды - бұл өнімділікті жақсартады.

Компилятор әрекеттерді әртүрлі тәсілдермен орындай алады: JIT компиляциясы (дәл уақытында) – динамикалық, тікелей бағдарламаны орындау кезінде немесе AOT компиляциясы (уақытынан бұрын) – орындауға дейін.

jaotc AOT компиляторы JDK 9 жүйесінде енгізілді. Қазіргі уақытта Hotspot JVM екі JIT компиляторын қамтиды, C1 (жылдамдық үшін) және C2 (оңтайландыру үшін).

JEP 317 JDK компиляторы Graal зерттеу жобасын ұсынады. Бұл Metropolis-ті шындыққа айналдыруға көмектесетін және JVM өнімділігінде C++ тілінде жазылған ағымдағы нұсқаға сәйкес келуіне (немесе одан да жақсырақ, асып кетуіне) мүмкіндік беретін белгілі бір негіз. [319] Түбірлік сертификаттар JDK жүйесіндегі стандартты сертификаттау орталығы (CA) сертификаттарының әдепкі жинағы болып табылады. TLS сияқты маңызды қауіпсіздік құрамдастары енді OpenJDK құрастыруларында әдепкі бойынша жұмыс істейді. Бұл пайдалы қосымша OpenJDK екілік файлдары мен Oracle JDK екілік файлдары функционалдық жағынан бірдей болуын қамтамасыз ету үшін Oracle істеп жатқан жұмыстың бір бөлігі болуы мүмкін. [322] Уақытқа негізделген шығарылым нұсқасы - Java 10-да Мүмкіндік шығарылымдарына жаңа мүмкіндіктер қосылады және Жаңарту шығарылымдарында қателер түзетіледі. Негізінде, бізде 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.Құралдар жинағы

    int getMenuShortcutKeyMaskEx (): Қандай кеңейтілген модификатор пернесі төте жол мәзірі үшін сәйкес үдеткіш перне екенін анықтайды.

  • java.awt.geom.Path2D:

    void trimToSize (): Осы дананың сыйымдылығын Path2Dағымдағы өлшеміне дейін қысқартады. Бағдарлама жолды сақтауды азайту үшін осы әрекетті пайдалана алады. Дәл осындай әдіс ішкі сыныптарға Path2D.Doubleжәне Path2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): шамадан тыс жүктелген toString, көрсетілген codeтау арқылы byteтарды деcodeтау арқылы буфер мазмұнын жолға түрлендіреді.

  • 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 виртуалды машинасының сипаттамасымен анықталғандай осы стек жақтауымен ұсынылған әдіске дескрипторды қайтарады.

  • 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