JavaRush /Java блогы /Random-KK /Java 13: Жаңа мүмкіндіктер

Java 13: Жаңа мүмкіндіктер

Топта жарияланған
Біз JDK жаңа шығарылымының жарты жыл сайын шығатынына үйреніп қалдық. Әзірге бұл тәсіл өзін ақтады және кейбір әзірлеушілердің жаңартуларға ілеспейді деген уайымы бекер болды: алты айлық өзгерістер аз және олар бұрынғыдай жаһандық емес. Жаңадан бастаған бағдарламашылар жаңашылдықты мүлдем байқамауы мүмкін. Java 13: жаңа мүмкіндіктер - 1Дегенмен, болашақ бағдарламалық жасақтама жасаушылардың жаңалықтардан хабардар болғаны дұрыс. Бұл мақалада біз дәстүрлі түрде қабылданған кеңейту ұсыныстарын (JEPs) сипаттайтын боламыз. Java 13 тек бес JEP және 76 жаңа негізгі кітапхана элементтерін қамтиды (олардың жартысына жуығы java.io пакетіне қарапайым толықтырулар).

JEP 355 : Мәтін блоктары (алдын ала қарау)

Тілдің синтаксисін өзгертуден бастайық. Олардың ең маңыздысы мәтіндік блоктар. Олар таңбалардан қашып құтылуға және жолдарды пішімдеуді білуге ​​мүмкіндік береді. JDK 12 жол литералдарымен жұмыс істеуге арналған күтілетін шикізат жолының литералдары (JEP 326) мүмкіндігін қамтымағанын есте сақтауыңыз мүмкін . Java 13-те ол мәтіндік блоктары бар JEP 355-ке ауыстырылды. Java тілінде жол қос тырнақшаға оралғанын есте ұстаған шығарсыз. Бұл жақсы, бірақ мәселе мынада: жол бастапқы файлдың бірнеше жолын ала алмайды (Java желісімен шатастырмау үшін, бұл жерде файл жолын «жол» деп атаймыз). Ал, айналып өтіп, мысалы, \nүзіліс қажет болса таңбаны немесе көп жолды өрнектерді біріктіруді қолданайық. Бұл өте жақсы шықпайды! Енгізілген HTML, XML, SQL немесе JSON фрагменттері бар мәтін литералдары әсіресе қиын. Барлық осы қашу, біріктіру және қолмен өңдеу codeты жазуды қолайсыз етеді және оқуды қиындатады. Мәтіндік блоктар бұл мәселені шешуге тырысады. Олар үш қос тырнақшадан басталып, солармен аяқталады (білемін, бұл өте жақсы естілмейді). Тырнақшалар арасындағы барлығы жаңа жолдарды қоса алғанда, жолдың бөлігі ретінде түсіндіріледі. Мәтіндік блоктарды стандартты мәтін литералдарымен бірдей пайдалануға болады және Java codeты дәл осылай құрастырады. Ашылатын тырнақшалардан кейін жолды бөлгіш болуы керек; мәтін блоктарын бір жолда пайдалану мүмкін емес, сондықтан code
String smallBlock = """Only one line""";
келесі қателерге әкеледі:
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""";
                                   	^
Қарапайым HTML фрагментін енді келесідей жазуға болады:
String htmlBlock = """
               	<html>
                 	<body>
                   	<p>CodeGym Web page</p>
                 	</body>
               	<html>
         	     """;
Мәтіндік блоктарды пайдалану кезінде білуге ​​болатын бірнеше нәзіктіктерді атап өтейік. Жабылатын тырнақшалардың орналасуы маңызды болып шықты: ол кездейсоқ бос кеңістіктің қалай өңделетінін анықтайды. Жоғарыдағы мысалда жабу тырнақшалары HTML мәтінінің шегінісімен тураланған. Бұл жағдайда компилятор шегіністерді жояды, нәтижесінде біз келесідей жолды аламыз:
<html>
  <body>
    <p>My web page</p>
  </body>
</html>
Назар аударыңыз:мұндай жолда жолдың соңында жаңа жол болады. Қажет болмаса, «»» жабылатын тырнақшаларды тікелей </html> тегінен кейін қоюға болады. Егер жабу тырнақшаларын сол жақ шетке жақындатсақ, бұл жойылған шегіністің көлемін өзгертеді. Егер біз оларды екі бос орынға солға жылжытсақ, әрбір жолға шегініс үшін екі бос орын қосамыз. Сол жақ жиекке жылжыту барлық толтырғыштардың сақталуына әкеледі. Тырнақшаларды одан әрі оңға жылжыту ешқандай әсер етпейді және басқа шегініс қоспайды. Мәтіндік блоктар JDK 13 жүйесіне алдын ала қарау мүмкіндігі ретінде енгізілген. Бұл олардың сәйкес Java тілінің спецификациясына әлі қосылмағанын білдіреді. Яғни, бұл қасиет тілдің тұрақты бөлігіне айнала ма, әлде бұл жерде жай қонақ па, белгісіз. Қазіргі уақытта әзірлеушілер мүмкіндікті сынап, ол туралы өз пікірін бере алады. Мәтіндік блоктардың тағдыры соған байланысты болады: мүмкіндікті жақсартуға болады, ал егер сізге ұнамаса, оны мүлдем алып тастауға болады. Мәтіндік блоктарды іс жүзінде қолданып көргіңіз келсе, құрастыру және іске қосу үшін алдын ала қарау мүмкіндіктері анық түрде қосылуы керек екенін есте сақтаңыз. Құрастыру:

javac --enable-preview --release 13 TextBlock.java
Қолданбаны іске қосу үшін алдын ала қарау мүмкіндіктерін қосу керек:

java --enable-preview TextBlock
Сыныпта Stringосы тіл өзгерісін толықтыратын үш жаңа әдіс бар:
  • formatted(): Пішім жолы ретінде жолды пайдаланып жолды пішімдеңіз. Сынақпен теңformat(this, args)
  • stripIndent(): Жолдан кездейсоқ бос орындарды жояды. Бұл көп жолды жолдарды оқып жатсаңыз және нақты мәлімдемедегідей бос кеңістікті алып тастауды қолданғыңыз келсе пайдалы.
  • translateEscapes()\ r: Тиісті Юниcode мәніне аударылған (мысалы, сияқты) шығу реттері бар жолды қайтарады .
Бір қызығы, бұл әдістер енді ғана пайда болды, бірақ бұрыннан ескірген деп белгіленген ... бұл жағдай оларды JDK болашақ нұсқасында жоюға болатынын көрсетеді. Жаңа әдісті қосып, одан бірден бас тарту біршама эксцентрик болып көрінеді. Дегенмен, бұл әдістер өзгертуге немесе жоюға болатын алдын ала қарау мүмкіндігімен байланысты екенін ескеріңіз. Аннотацияны енгізу @PreviewFeatureмұндай жағдайларда көмектесетін шығар, бірақ ол әлі JDK құрамына кірмеген (бірақ ол JDK 14-те пайда болуы ықтималдығы жоғары).

JEP 354 : өрнекті ауыстыру (алдын ала қарау)

Java 12 коммутатор операторы бар өрнектерді жазудың жаңа формасы - JEP 325 ұсынысын енгізді . Бұл ең бірінші алдын ала қарау мүмкіндігі болды және оның тағдыры пайдаланушыларға ұсыныстар жіберу тамаша идея екенін дәлелдейді. JDK 12-ге дейін switchол әрекетті орындайтын, бірақ нәтижені қайтармайтын мәлімдеме ретінде ғана пайдаланылуы мүмкін. switchБірақ Java 12-де оны айнымалыға тағайындауға болатын нәтижені қайтаратын өрнек ретінде пайдалануға мүмкіндік берді . ішінде кейс мәлімдемелерінің синтаксисіне басқа өзгерістер болды switch. Мұның қалай жұмыс істейтінін түсіну үшін JEP үлгісін қарастырайық.
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);
}
Бұл мысалда dayOfWeekмәнді тағайындау үшін мәнді пайдаланамыз numberOfLetters. Оператор жұмысының ерекшеліктеріне байланысты switchбұл code ең әдемі емес және қателесу оңай. Біріншіден, егер біз іс жапсырмаларының әрбір тобына мәлімдеме қолдануды ұмытып қалсақ break, біз келесі іс белгілері тобына әдепкі мән береміз. Бұл табу қиын қателерге әкелуі мүмкін. Екіншіден, іс белгілерінің әрбір тобын анықтауымыз керек. Егер біз ұмытып қалсақ, онда, әрине, біз компилятор қатесін аламыз, бірақ бұл опция идеалды емес. Біздің codeымыз да өте егжей-тегжейлі, өйткені әрбір мәннің dayOfWeekжеке іс белгісі болуы керек. Жаңа синтаксисті пайдалана отырып, біз әлдеқайда таза және қатеге бейім codeты аламыз:
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);
};
Енді бізге тапсырманы тек бір рет жасау керек (өрнектің қайтару мәнінен switch) және регистр белгілері үшін үтірмен бөлінген тізімді пайдалана аламыз. Біз операторды пайдаланбағандықтан break, онымен байланысты мәселелерді жоямыз. Өрнек синтаксисі switchескі стиль синтаксисін пайдалануға мүмкіндік береді, сондықтан JDK 12-де оны келесідей жаза аламыз:
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 қауымдастығына сәйкес, breakқайтару мәнін көрсету үшін шамадан тыс жүктеуді пайдалану шатастыруы мүмкін. Java тілі сонымен қатар шартсыз өту операторы сияқты белгімен break( және ) пайдалануға мүмкіндік береді . JEP 354 бұл пайдалануды өзгертті , сондықтан Java 13-те біздің code аздап өзгереді: 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);
};
Келесі үш JEP Java виртуалды машинасымен байланысты.

JEP 350 динамикалық CDS мұрағаты

Бұл кеңейтім Java қолданбасының орындалуының соңында сыныптарды динамикалық түрде мұрағаттауға мүмкіндік береді. class data sharingCDS немесе Class Data Sharing әдепкі бойынша осы сыныптардың тізімін пайдалана отырып, іске қосу кезінде іске қосылған барлық сыныптарды арнайы мұрағатқа жинауға мүмкіндік береді . Бұл қолданбаларды іске қосуды және жедел жадты үнемдеуді айтарлықтай жеделдетуге әкеледі. Бұрын AppCDS пайдалану тиісті сыныптар тізімін жасауды және сол тізімді келесі іске қосулар үшін пайдаланылатын мұрағатты жасау үшін пайдалануды қамтитын көп сатылы процесс болды. ArchiveClassesAtExitЕнді мұрағат жазылатын орынды көрсететін -XX: жалаушасы бар қолданбаны бір рет іске қосу қажет . Бұл тәсілмен қолданба қалыпты түрде тоқтатылғаннан кейін сыныптар автоматты түрде мұрағатқа жиналады.

JEP 351 ZGC : пайдаланылмаған жадты босату

Бір жыл бұрын JDK 11 ZGC тәжірибелік, масштабталатын, кідіріссіз қоқыс жинағышты ұсынды. Алғашында ZGC өзін өте біртүрлі ұстады: ол жадты операциялық жүйеге қайтаруға мүмкіндік бермеді, тіпті қажет болмаса да. Ресурстарды бір уақытта бірнеше қызметтер пайдаланатын контейнерлер сияқты кейбір орталар үшін бұл жүйенің ауқымдылығы мен тиімділігін шектеуі мүмкін. ZGC үйіндісі ZPages деп аталатындардан тұрады. ZPages қоқыс жинау циклі кезінде тазартылғанда, олар ZPageCache-ге қайтарылады. Бұл кэштегі ZPages олардың қаншалықты жақында пайдаланылғанына қарай реттелген. Java 13 нұсқасында ZGC операциялық жүйеге ұзақ уақыт бойы пайдаланылмаған беттерді қайтарады. Осылайша оларды басқа процестер үшін қайта пайдалануға болады.

JEP 353 Бұрынғы Socket API қайта іске қосыңыз

Екі API енгізуі java.net.Socketәлі java.net.ServerSocketде JDK 1.0. Бұл және барлық кейінгі JDK-де, осы API интерфейстерін іске асыру оларды икемсіз және техникалық қызмет көрсетуді қиындататын бірнеше әдістерді (мысалы, ағын стекін енгізу/шығару буфері ретінде пайдалану) пайдаланады. Бұл мәселені шешу үшін JDK 13-те жаңа енгізу ұсынылды NioSocketImpl. Ол бұдан былай жергілікті codeты қажет етпейді, бұл әртүрлі платформаларға өтуді жеңілдетеді. java.util.concurrentБұл сынып сонымен қатар синхрондалған әдістерді емес, бар буфер кэш механизмін (осы мақсат үшін ағын стекін пайдалануды болдырмайды) және құлыптауды пайдаланады . Бұл Project Loom талшықтарымен интеграцияны жеңілдетеді .

Жаңа API интерфейстері

Біз Java 13 базалық класс кітапханаларында 76 жаңа API қамтитынын жоғарыда айттық. Олар келесі аймақтарды қамтиды:
  • Юниcodeты қолдау жаңартулары.
  • StringМәтіндік блоктарды қолдаудың үш жаңа әдісі (жоғарыдағы JEP 255 сипаттамасын қараңыз).
  • Сыныптар java.nioенді абсолютті (салыстырмалыға қарағанда) getжәне әдістерді орнату. Олар, базалық дерексіз класс сияқты , буфер бөлігін шығарып алу Bufferәдісін қамтиды . slice()
  • force()Класс әдісі MappedByteBufferбуферлік бөлімді оның қосалқы қоймасына жазуға мәжбүр етеді.
  • nio.FileSystemnewFileSystem()файлдың мазмұнына файлдық жүйе ретінде қол жеткізу үшін үш жаңа шамадан тыс жүктелген пішінді қосады .
  • Жаңа қызықты әдіс пайда болды javax.annotation.processing.ProcessingEnvironment. isPreviewEnabled(). Ол алдын ала қарау мүмкіндіктерінің қосылған-қосылмағанын хабарлайды. Бұл қызықты, себебі жоғарыда аталған annotation @PreviewFeatureJDK 14 шығарылғанға дейін қолжетімді болмайды.
  • DocumentBuilderFactoryжәне аттар кеңістігін ескеретін даналарды жасаудың үш жаңа әдісін SAXParserFactoryалыңыз .javax.xml.parsers
Материал Саймон Риттер мақаласына және ресми құжаттамаға негізделген .
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION