JavaRush /Java Blogu /Random-AZ /Java 13: Yeni Xüsusiyyətlər

Java 13: Yeni Xüsusiyyətlər

Qrupda dərc edilmişdir
Biz artıq hər altı aydan bir yeni JDK buraxılışının çıxmasına öyrəşmişik. İndiyə qədər bu yanaşma özünü doğrultdu və bəzi tərtibatçıların yeniləmələrlə ayaqlaşmayacaqları ilə bağlı narahatlığı boşa çıxdı: altı aylıq dəyişikliklər azdır və onlar əvvəlki kimi qlobal deyil. Yaxşı, təcrübəsiz proqramçılar yeniliyi ümumiyyətlə görməyə bilərlər. Java 13: yeni xüsusiyyətlər - 1Bununla belə, gələcək proqram tərtibatçıları üçün yeniliklərdən xəbərdar olmaq daha yaxşıdır. Bu yazıda biz ənənəvi olaraq qəbul edilmiş genişləndirmə təkliflərini (JEPs) təsvir edəcəyik. Java 13-ə yalnız beş JEP və 76 yeni əsas kitabxana elementi daxildir (onların demək olar ki, yarısı java.io paketinə sadə əlavələrdir).

JEP 355 : Mətn Blokları (Ön baxış)

Dilin sintaksisini dəyişdirməklə başlayaq. Onlardan ən əhəmiyyətlisi mətn bloklarıdır. Onlar simvollardan qaçmaqdan qaçmağa və sətirləri necə formatlaşdırmağı bilməyə imkan verir. Yadınızdadır ki, JDK 12 sətir hərfi ilə işləmək üçün gözlənilən Raw String Literals ( JEP 326) funksiyasını ehtiva etməmişdir. Java 13-də mətn blokları ilə JEP 355 ilə əvəz olundu. Yəqin xatırlayırsınız ki, Java-da sətir qoşa dırnaqlara bükülür. Bu yaxşıdır, lakin problem ondadır ki, xətt mənbə faylın birdən çox sətrini tuta bilməz (Java xətti ilə çaşqınlığın qarşısını almaq üçün burada fayl xəttini “sətir” adlandıracağıq). Yaxşı, gedək və məsələn, \nfasilə tələb olunarsa simvoldan və ya çoxsətirli ifadələrin birləşməsindən istifadə edək. Çox gözəl alınmır! Daxili HTML, XML, SQL və ya JSON fraqmentləri olan mətn hərfləri xüsusilə çətin olur. Bütün bu qaçış, birləşmə və əl ilə redaktə kodu yazmaq üçün əlverişsiz edir və oxunmasını çətinləşdirir. Mətn blokları bu problemi həll etməyə çalışır. Onlar uh... üçlü qoşa dırnaqla başlayır və onlarla bitir (bilirəm, çox yaxşı səslənmir). Sitatlar arasındakı hər şey yeni sətirlər də daxil olmaqla sətirin bir hissəsi kimi şərh olunur. Mətn blokları standart mətn hərfləri ilə eyni şəkildə istifadə edilə bilər və Java kodu eyni şəkildə tərtib edəcəkdir. Açılış sitatlarından sonra sətir ayırıcısı olmalıdır; mətn blokları bir sətirdə istifadə edilə bilməz, buna görə də kod
String smallBlock = """Only one line""";
aşağıdakı səhvlərə səbəb olacaq:
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                          ^
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                                   	^
Sadə bir HTML fraqmenti indi belə yazıla bilər:
String htmlBlock = """
               	<html>
                 	<body>
                   	<p>CodeGym Web page</p>
                 	</body>
               	<html>
         	     """;
Mətn bloklarından istifadə edərkən xəbərdar olmaq daha yaxşı olan bir neçə incəlikləri qeyd edək. Bağlama sitatlarının yerləşdirilməsi vacibdir: bu, təsadüfi boşluqların necə idarə olunduğunu müəyyənləşdirir. Yuxarıdakı misalda bağlanış sitatları HTML mətninin abzası ilə üst-üstə düşür. Bu halda kompilyator girinti boşluqlarını siləcək və nəticədə belə bir xətt alacağıq:
<html>
  <body>
    <p>My web page</p>
  </body>
</html>
Qeyd:belə bir sətir xəttin sonunda yeni sətir ehtiva edəcəkdir. Ehtiyac yoxdursa, bağlanan dırnaq işarələri “”” birbaşa </html> teqindən sonra yerləşdirilə bilər. Bağlama dırnaqlarını sol kənara yaxınlaşdırsaq, bu, silinən abzasın miqdarını dəyişəcək. Onları iki boşluq sola köçürsək, hər sətir sətirinə girinti üçün iki boşluq əlavə edərdik. Sol kənara keçmək bütün paddingin saxlanmasına səbəb olacaq. Sitatları daha sağa köçürməyin heç bir təsiri olmayacaq və daha çox abzas əlavə etməyəcək. Mətn blokları JDK 13-ə ilkin baxış funksiyası kimi daxil edilmişdir. Bu o deməkdir ki, onlar hələ müvafiq Java dili spesifikasiyasına daxil edilməyib. Yəni, bu xüsusiyyətin dilin daimi hissəsinə çevriləcək, yoxsa burada sadəcə qonaq olub-olmayacağı bəlli deyil. Hazırda tərtibatçılar funksiyanı sınaqdan keçirə və bu barədə öz fikirlərini bildirə bilərlər. Mətn bloklarının taleyi ondan asılı olacaq: xüsusiyyət yaxşılaşdırıla bilər və xoşunuza gəlmirsə, o, tamamilə silinə bilər. Mətn bloklarını praktikada sınamaq istəyirsinizsə, yadda saxlayın ki, tərtib etmək və işə salmaq üçün ilkin baxış xüsusiyyətləri açıq şəkildə daxil edilməlidir. Tərtib:

javac --enable-preview --release 13 TextBlock.java
Tətbiqi işə salmaq üçün önizləmə funksiyalarını aktivləşdirməlisiniz:

java --enable-preview TextBlock
Sinifdə Stringbu dil dəyişikliyini tamamlayan üç yeni metod var:
  • formatted(): sətri format sətri kimi istifadə edərək sətri formatlaşdırın. Çağırışa bərabərdirformat(this, args)
  • stripIndent(): Sətirdən təsadüfi boşluqları silir. Əgər siz çoxsətirli sətirləri oxuyursunuzsa və açıq bəyannamə ilə eyni boşluq istisnasını tətbiq etmək istəyirsinizsə, bu faydalıdır.
  • translateEscapes()\ r: Müvafiq Unicode dəyərinə tərcümə edilmiş qaçış ardıcıllığı (məsələn, kimi) olan sətri qaytarır .
Maraqlıdır ki, bu üsullar indicə ortaya çıxdı, lakin artıq köhnəlmiş kimi qeyd olunub ... bu vəziyyət onların JDK-nın gələcək versiyasında silinə biləcəyini göstərir. Yeni bir üsul əlavə etmək və dərhal ondan imtina etmək bir qədər ekssentrik görünür. Bununla belə, unutmayın ki, bu üsullar dəyişdirilə və ya silinə bilən önizləmə funksiyası ilə əlaqələndirilir. Ola bilsin ki, annotasiya təqdim etmək @PreviewFeaturebelə vəziyyətlərdə kömək edə bilər, lakin o, hələ JDK-ya daxil edilməyib (baxmayaraq ki, yüksək ehtimalla JDK 14-də görünəcək).

JEP 354 : İfadə dəyişin (Ön baxış)

Java 12, keçid ifadəsi ilə ifadələrin yazılmasının yeni forması üçün bir təklif təqdim etdi - JEP 325 . Bu, ilk baxış xüsusiyyəti oldu və onun taleyi sübut etdi ki, istifadəçilərə təkliflər təqdim etmək əla ideyadır. JDK 12-dən əvvəl switcho, yalnız bir hərəkəti yerinə yetirən, lakin nəticə qaytarmayan ifadə kimi istifadə edilə bilərdi. switchLakin Java 12-də onu dəyişənə təyin edilə bilən nəticəni qaytaran ifadə kimi istifadə etməyə icazə verdi . daxilində hal ifadələrinin sintaksisində başqa dəyişikliklər də oldu switch. Bunun necə işlədiyini başa düşmək üçün JEP-dən bir nümunəyə baxaq.
int numberOfLetters;
switch(dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
    numberOfLetter = 6;
    break;
  case TUESDAY
    numberOfLetter = 7;
    break;
  case THURSDAY
  case SATURDAY
    numberOfLetter = 8;
    break;
  case WEDNESDAY
    numberOfLetter = 9;
    break;
  default:
   throw new IllegalStateException("Huh?: " + day);
}
Bu nümunədə dayOfWeekdəyəri təyin etmək üçün dəyərdən istifadə edirik numberOfLetters. Operatorun işinin xüsusiyyətlərinə görə switch, bu kod ən gözəl deyil və səhv etmək asandır. breakBirincisi, əgər hər bir iş etiketləri qrupuna bəyanat tətbiq etməyi unutsaq , defolt olaraq növbəti iş etiketləri qrupuna keçəcəyik. Bu, tapmaq çətin olan səhvlərə səbəb ola bilər. İkincisi, hər bir iş etiketi qrupunu müəyyən etməliyik. Əgər unutsaq, əlbəttə ki, kompilyator xətası alacağıq, lakin bu seçim ideal deyil. Kodumuz da kifayət qədər ətraflıdır, çünki hər bir dəyərin dayOfWeeköz iş etiketi olmalıdır. Yeni sintaksisdən istifadə edərək, biz daha təmiz və daha az səhvə meyilli kod əldə edirik:
int numberOfLetters = switch (dayOfWeek) {
   case MONDAY, FRIDAY, SUNDAY -> 6;
   case TUESDAY -> 7;
   case THURSDAY, SATURDAY -> 8;
   case WEDNESDAY -> 9;
   default -> throw new IllegalStateException("Huh?: " + day);
};
İndi biz yalnız bir dəfə tapşırığı yerinə yetirməliyik (ifadənin qaytarılması dəyərindən switch) və iş etiketləri üçün vergüllə ayrılmış siyahıdan istifadə edə bilərik. Biz operatordan istifadə etmədiyimiz üçün breakonunla bağlı problemləri aradan qaldırırıq. İfadə sintaksisi switchbizə köhnə üslub sintaksisindən istifadə etməyə imkan verir, ona görə də JDK 12-də bunu belə yaza bilərik:
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   break 6;
  case TUESDAY
   break 7;
  case THURSDAY
  case SATURDAY
   break 8;
  case WEDNESDAY
   break 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Java icmasına görə, breakqaytarma dəyərini təyin etmək üçün həddindən artıq yükləmədən istifadə çaşqınlıq yarada bilər. Java dili həmçinin qeyd-şərtsiz keçid operatoru kimi etiketlə break( və ) istifadə etməyə imkan verir . JEP 354 bu istifadəni dəyişdi , buna görə də Java 13-də kodumuz bir qədər dəyişir: continuegotobreak
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   yield 6;
  case TUESDAY
   yield 7;
  case THURSDAY
  case SATURDAY
   yield 8;
  case WEDNESDAY
   yield 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Növbəti üç JEP Java Virtual Maşını ilə əlaqələndirilir.

JEP 350 Dinamik CDS Arxivi

Bu genişləndirmə Java proqramının icrasının sonunda sinifləri dinamik şəkildə arxivləşdirməyə imkan verir. class data sharingCDS və ya Class Data Sharing sizə başlanğıcda açılmış bütün sinifləri defolt olaraq eyni siniflərin siyahısını istifadə edərək xüsusi arxivə yığmağa imkan verir . Bu, tətbiqlərin işə salınmasında və RAM-a qənaətdə əhəmiyyətli bir sürətlənməyə səbəb olur. Əvvəllər AppCDS-dən istifadə müvafiq siniflərin siyahısının yaradılmasını və bu siyahıdan sonrakı əməliyyatlar üçün istifadə olunacaq arxiv yaratmaq üçün istifadə etməyi əhatə edən çoxmərhələli proses idi. ArchiveClassesAtExitİndi tələb olunan tək şey -XX: arxivin yazılacağı yeri göstərən bayraq ilə tətbiqin bir dəfə işə salınmasıdır . Bu yanaşma ilə, proqram normal şəkildə dayandırıldıqdan sonra siniflər avtomatik olaraq arxivə yığılır.

JEP 351 ZGC : İstifadə edilməmiş yaddaşı ləğv edin

Bir il əvvəl JDK 11 eksperimental, genişlənə bilən, aşağı gecikmə müddəti olan zibil yığan ZGC-ni təqdim etdi. Əvvəlcə ZGC özünü kifayət qədər qəribə apardı: yaddaşın artıq lazım olmasa belə, əməliyyat sisteminə qaytarılmasına imkan vermədi. Resursların birdən çox xidmət tərəfindən eyni vaxtda istifadə edildiyi konteynerlər kimi bəzi mühitlər üçün bu, sistemin miqyaslılığını və səmərəliliyini məhdudlaşdıra bilər. ZGC yığını ZPages adlanan hissələrdən ibarətdir. ZPages zibil toplama dövrü ərzində təmizləndikdə, onlar ZPageCache-ə qaytarılır. Bu keşdəki ZPages nə qədər yaxın istifadə edildiyinə görə sıralanır. Java 13-də ZGC uzun müddət istifadə olunmadığı müəyyən edilən səhifələri əməliyyat sisteminə qaytaracaq. Bu yolla onlar digər proseslər üçün təkrar istifadə edilə bilər.

JEP 353 Köhnə Socket API-ni yenidən tətbiq edin

Hər iki API tətbiqi hələ də JDK 1.0- java.net.Socketdır java.net.ServerSocket. Bu və bütün sonrakı JDK-larda bu API-lərin tətbiqi onları çevik olmayan və saxlanmasını çətinləşdirən bir neçə üsuldan (məsələn, ip yığınından I/O buferi kimi istifadə etmək) istifadə edir. Bu problemi həll etmək üçün JDK 13-də yeni bir tətbiq təmin edildi NioSocketImpl. Artıq yerli kod tələb etmir, bu da müxtəlif platformalara keçidi asanlaşdırır. java.util.concurrentBu sinif həmçinin sinxronlaşdırılmış metodlardan daha çox mövcud bufer keş mexanizmindən (bu məqsəd üçün ip yığınının istifadəsindən qaçınmaqla) və kiliddən istifadə edir . Bu, Project Loom- dan olan liflərlə inteqrasiyanı asanlaşdıracaq .

Yeni API-lər

Daha əvvəl qeyd etdik ki, Java 13 baza sinif kitabxanalarına 76 yeni API daxildir. Onlar aşağıdakı sahələri əhatə edir:
  • Unicode dəstəyi yeniləmələri.
  • StringMətn bloklarını dəstəkləmək üçün üç yeni üsul (yuxarıda JEP 255 təsvirinə baxın).
  • Siniflər java.nioindi mütləq (nisbidən fərqli olaraq) get üsulları təyin edin. Onlar, əsas mücərrəd sinif kimi Buffer, slice()buferin bir hissəsini almaq üçün bir metodu ehtiva edir.
  • force()Sinif metodu MappedByteBufferbufer bölməsini onun dəstək yaddaşına yazmağa məcbur edir.
  • nio.FileSystemnewFileSystem()fayl sistemi kimi faylın məzmununa daxil olmaq üçün üç yeni həddindən artıq yüklənmiş forma əlavə edir .
  • Yeni maraqlı üsul ortaya çıxdı javax.annotation.processing.ProcessingEnvironment. isPreviewEnabled(). Önizləmə xüsusiyyətlərinin aktiv olub olmadığını sizə xəbər verəcəkdir. Bu maraqlıdır, çünki yuxarıda qeyd olunan annotasiya @PreviewFeatureJDK 14 buraxılana qədər mövcud olmayacaq.
  • DocumentBuilderFactoryvə ad məkanından xəbərdar olan nümunələr yaratmaq üçün üç yeni üsul SAXParserFactoryəldə edin .javax.xml.parsers
Material Simon Ritterin məqaləsinə və rəsmi sənədlərə əsaslanır .
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION