JavaRush /Java Blogu /Random-AZ /Yeni Java... Yenə... Java 10 ilə tanış olun

Yeni Java... Yenə... Java 10 ilə tanış olun

Qrupda dərc edilmişdir
Əvvəllər tərtibatçılar bir neçə ildir ki, bəziləri qorxu, bəziləri isə ümidlə yeni Java-nı gözləyirdilər. Zaman dəyişdi və JDK-nın yeni versiyaları hər altı aydan bir bizi sevindirəcək. Bunun nəyə gətirib çıxaracağı hələ sizə aydın deyilsə, ekspertin rəyinə baxın və burada sevimli dilimizin ən yeni versiyası olan Java 10-da əsas dəyişiklikləri sadalayacağıq. Yeni Java... Yenə... Java 10 - 1 ilə tanış olunYeni "xüsusiyyət" dən əvvəl kvadrat mötərizədə JEP nömrəsi göstərilir, yəni "JDK Enchancement Proposal". JEP OpenJDK-nı təkmilləşdirmək üçün təklifdir və təsdiq oluna, gecikdirilə və ya rədd edilə bilər. Yəni mahiyyət etibarı ilə JEP kolleksiyası OpenJDK üçün inkişaf strategiyasıdır.

Java 10-un vacib xüsusiyyətləri

[286] Lokal-Dəyişən Növ Nəticəsi - Var açar sözünü Java-ya daxil etmək təklifi, yerli dəyişənin tipini açıq şəkildə təyin etmək ehtiyacını aradan qaldırır. Yəni, indi başlatılan dəyişənin növünü təyin edə bilməzsiniz, ancaq belə bir şey yazın:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
Bu, əvvəllər istifadə etməli olduğumuz ArrayList<String> tipli tərifin təkrarlanmasını aradan qaldırır. Maraqlıdır ki, var açar sözə çevrilmir, lakin qorunan bir növdür. Yəni var-dan dəyişənin, metodun və ya paketin adı kimi istifadə edə bilərsiniz. Ancaq sinfi bu şəkildə adlandıra bilməyəcəksiniz (nə itki!). [296] JDK meşəsinin vahid depoda birləşdirilməsi . JDK 9-da səkkiz depo var - root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. Java 10-da bütün bu meşə bir-birindən asılı dəyişikliklər dəstlərinin repozitoriyaları arasında atom öhdəliyini yerinə yetirməyi mümkün etmək üçün vahid depoda birləşdiriləcək. [304] Zibil Kollektoru İnterfeysi tərtibatçılar tərəfindən zibil yığılmasına nəzarət etmək üçün istifadə edilə bilən interfeys deyil. Bunun əvəzinə biz JVM mənbə kodunda təmiz zibil toplayıcı interfeysi əldə edirik ki, bu da sizə alternativ kollektorları tez və asanlıqla inteqrasiya etməyə imkan verir. JVM-ə öz zibil kollektorunu əlavə etmək arzusunda olanlar bu təkmilləşdirmədən çox məmnun olacaqlar. [307] G1 zibil toplayıcısı üçün Paralel Tam GC . JDK 9-da G1 defolt zibil toplayıcısı oldu, halbuki əvvəllər defolt zibil kollektoru birdən çox mövzu üzrə zibil toplaya bilən Paralel GC idi. İndi G1 bunu da edə bilər, əvvəllər bunu bir ipdə edirdi, bu da bəzən çətinlik yaradırdı. XX:ParallelGCThreads. Yeri gəlmişkən, tərtibatçılar - [310] Application Class-Data Sharing parametrindən istifadə edərək mövzuların sayını konfiqurasiya edə biləcəklər - Java 10-da qəbul edilmiş bu inkişaf təkmilləşdirilmiş yükləmə və izləmə təklif edir, mövcud Class Sharing (CDS) funksiyasını genişləndirir. tətbiq siniflərinin ümumi arxivdə yerləşməsinə icazə vermək. Class-Data Sharing və ya *class uzantılı fayllarla qısa iş üçün CDS. Bu funksiya müəyyən bir sinif alt dəstini seçməyə, onları emal etməyə və xüsusi arxivə sıxmağa imkan verir. Bütün bunlar yaddaşa qənaət etmək üçün edilir. Çox vaxt JVM-nin müxtəlif nümunələri standart kitabxanaya daxil olan eyni sinifləri yükləyir. Və CDS bütün bu JVM nümunələrinə bir arxivi orada yerləşdirilən siniflərlə paylaşmağa imkan verir. Bu, həm proqram yükləmə vaxtını, həm də yaddaşdan istifadəni azaldır. Əslində, CDS JVM başlanğıc performansını yaxşılaşdırır və 5-ci versiyadan başlayaraq birdən çox JVM eyni fiziki və ya virtual maşında işləyərkən resurs izini azaldır. Lakin əvvəllər CDS-nin istifadəsi yalnız yükləyici yükləyici ilə məhdudlaşırdı. İndi Application CDS adlı genişləndirilmiş versiya digər yükləyicilər üçün sinifləri olan xüsusi arxivləri yükləməyə imkan verir. [312] Thread-Local Handshakes JVM daxilində kifayət qədər aşağı səviyyəli dəyişiklikdir ki, bu da qlobal VM təhlükəsizlik nöqtəsini işə salmadan mövzular arasında geri çağırışların icrasına imkan verəcək. Bu, bir anda (və ya heç birini) deyil, ayrı-ayrı ipləri xərcsiz dayandırmağa imkan verəcəkdir. [313] Yerli Başlıq Yaratma Alətini (javah) silin . Java 9-da dil tərtibatçıları lazımsız alətləri aktiv şəkildə silməyə başladılar və JEP 313 bu yaxşı işi davam etdirir. Kodda yerli metodlar varsa, javah aləti JNI başlıqlarını yaradır. Sağlam? Əlbəttə, lakin JDK 8 ilə başlayan yerli javac kompilyatoru özü JNI başlıqlarını yarada bilər. Beləliklə, indi javahdan qurtulmaq qərarına gəldilər. Yeri gəlmişkən, hazırda Panama layihəsi hazırlanır ki , bu da xüsusilə JNI-ni əvəz edə bilər. [314] Əlavə Unicode Dil-Teq Genişləndirmələri Bu dəyişiklik BCP 47 dil teqlərinə əlavə Unicode genişləndirmələrini həyata keçirmək üçün java.util.Locale sinifini və əlaqəli API-ləri təkmilləşdirmək üçün nəzərdə tutulub. Xüsusilə, valyuta növü (cu), birinci gün üçün teqlər indi həftə (fw), region (rg) və saat qurşağı (tz) ləğv ediləcək. [316] Alternativ Yaddaş Qurğularında Yığın Ayırma Bu yenilik DRAM-dan başqa yaddaş növlərindən istifadə edənlərə kömək edəcək. Texnologiyalar daim dəyişdiyindən, eyni interfeysə və DRAM-a oxşar performans xüsusiyyətlərinə malik qeyri-sabit yaddaşdan istifadə günümüzün obyektiv reallığıdır. Beləliklə, JEP 316 JVM-ə digər yaddaş növlərinə yığın yerləşdirməyə imkan verir. [317] Eksperimental Java Əsaslı JIT Kompilyatoru . Bu yaxınlarda Java-da JVM-nin əksəriyyətini yenidən yazmağı təklif edən Metropolis layihəsi elan edildi. Əgər bilmirsinizsə, cari versiya C++ dilində yazılmışdır. Yaxşı, əgər siz artıq məlumatlısınızsa, yəqin ki, əvvəlcə belə bir fikir sizə qəribə görünəcək. JVM Java-da yazıldığından, JVM-i işə salmaq üçün JVM-ə ehtiyacınız olmayacaqmı? Bir-birinə qarşı güzgüləri xatırladan rekursiya belədir. Bununla belə, reallıq bir az fərqlidir: JVM Java-da yazıldığı üçün bu, onu bayt kodlarına yığmalı olduğunuz demək deyil. Siz həqiqətən AOT tərtibindən istifadə edə bilərsiniz və sonra JIT performansı yaxşılaşdırmaq üçün işlədiyi üçün kodu tərtib edir.

Java kodunu tərtib etmək üçün adətən javac kimi bir vasitə istifadə olunur. O, Java proqramını bayt kodlu sinif faylları dəstinə çevirir. Sonra JVM bayt kodunu işlədir və onun tərcüməçisi onları prosessor təlimatlarına çevirir. Tərcüməçiyə əlavə olaraq, JVM-də quraşdırılmış kompilyator da var və o, həmçinin bayt kodundan prosessor üçün təlimatlar yarada bilər. Bu, başlanğıc zamanı tərtib, iş vaxtı tərtibatı adlanır. Adətən ən çox istifadə olunan kod belə tərtibə məruz qalır - bu, performansı yaxşılaşdırır.

Kompilyator hərəkətləri müxtəlif üsullarla yerinə yetirə bilər: JIT kompilyasiyası (vaxtında) - dinamik, proqramın icrası zamanı və ya AOT tərtibi (vaxtından əvvəl) - icradan əvvəl.

jaotc AOT kompilyatoru JDK 9-da təqdim edilmişdir. Hazırda Hotspot JVM-də C1 (sürət üçün) və C2 (optimallaşdırma üçün) iki JIT kompilyatoru var.

JEP 317, JDK üçün tərtibçi olan Graal tədqiqat layihəsini təqdim edir. Bu, Metropolis-i reallığa çevirməyə kömək edəcək və JVM-nin performans baxımından C++-da yazılmış cari versiyaya uyğun gəlməsinə (yaxud daha yaxşısı, onu keçməsinə) imkan verəcək müəyyən əsasdır. [319] Kök Sertifikatlar JDK-da standart Sertifikatlaşdırma Təşkilatı (CA) sertifikatlarının defolt dəstidir. TLS kimi kritik təhlükəsizlik komponentləri indi OpenJDK qurmalarında standart olaraq işləyəcək. Bu faydalı əlavə, çox güman ki, Oracle-ın OpenJDK binaries və Oracle JDK binaries funksional olaraq eyni olmasını təmin etmək üçün gördüyü işlərin bir hissəsidir. [322] Vaxta əsaslanan buraxılış versiyaları - Java 10-da Xüsusiyyət buraxılışlarına yeni xüsusiyyətlər əlavə ediləcək və Yeniləmə Relizlərində səhvlər düzəldiləcəkdir. Əslində, JDK versiyasının sətir formatlarını təyin etmək üçün yeni bir yolumuz var. O, JDK 9 ilə kifayət qədər qəribə vəziyyəti düzəldir. İlk yeniləmə JDK 9.0.1 idi, bu olduqca məntiqlidir. İkinci yeniləmə JDK 9.0.4-dir ki, bu da məntiqsizdir. Məntiq ondan ibarətdir ki, JDK 9 versiyasının nömrələmə sxemində fövqəladə, planlaşdırılmamış yeniləmə zamanı yeniləmələr arasında boşluq qalır. Yeniləmə lazım olmadığı üçün niyə onu JDK 9.0.2 adlandırmayaq? Yeni Java versiyası formatı belə görünür:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

Yeni API-lər

JDK 10 standart sinif kitabxanalarına 73 əlavə var.
  • java.awt.Alətlər dəsti

    int getMenuShortcutKeyMaskEx (): Qısayol menyusu üçün hansı genişləndirilmiş dəyişdirici düymənin müvafiq sürətləndirici düymə olduğunu müəyyən edir.

  • java.awt.geom.Path2D:

    void trimToSize (): Bu nümunənin tutumunu Path2Dcari ölçüsünə qədər kəsir. Tətbiq yol yaddaşını minimuma endirmək üçün bu əməliyyatdan istifadə edə bilər. Eyni üsul daxili siniflərə Path2D.DoublePath2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): həddən artıq yüklənmişdir toString, göstərilən kodlaşdırmadan istifadə edərək baytları deşifrə etməklə buferin məzmununu sətirə çevirir.

  • java.io.PrintStream və lang.io.PrintWriter:

    Bu siniflərin hər ikisində əlavə arqument alan üç yeni konstruktor var charset.

  • java.io.Reader:

    long transferTo (Writer): Bu oxucudan bütün personajları oxuyur və personajları oxunma ardıcıllığı ilə verilmiş yazıçıya yazır.

  • java.lang.Runtime.Versiya:

    Sətir sahələrinin yeni versiyası (JEP 322) üçün tam dəyər qaytaran dörd yeni üsul: feature (), interim (), patch ()update ().

  • java.lang.StackWalker.StackFrame:

  • getDescriptor() sətri:

    Java Virtual Maşın Spesifikasiyası ilə müəyyən edilmiş bu yığın çərçivəsi ilə təmsil olunan metoda sapı qaytarır.

  • String getMethodType():

    MethodTypeYığın çərçivəsi ilə təmsil olunan metod üçün parametr növlərini və qaytarma növünü təmsil edən qaytarır .

  • 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): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION