Біз JDK жаңа шығарылымының жарты жыл сайын шығатынына үйреніп қалдық. Әзірге бұл тәсіл өзін ақтады және кейбір әзірлеушілердің жаңартуларға ілеспейді деген уайымы бекер болды: алты айлық өзгерістер аз және олар бұрынғыдай жаһандық емес. Жаңадан бастаған бағдарламашылар жаңашылдықты мүлдем байқамауы мүмкін. Дегенмен, болашақ бағдарламалық жасақтама жасаушылардың жаңалықтардан хабардар болғаны дұрыс. Бұл мақалада біз дәстүрлі түрде қабылданған кеңейту ұсыныстарын (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 мәніне аударылған (мысалы, сияқты) шығу реттері бар жолды қайтарады .
@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 аздап өзгереді: continue
goto
break
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 sharing
CDS немесе 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.FileSystem
newFileSystem()
файлдың мазмұнына файлдық жүйе ретінде қол жеткізу үшін үш жаңа шамадан тыс жүктелген пішінді қосады .- Жаңа қызықты әдіс пайда болды
javax.annotation.processing.ProcessingEnvironment
.isPreviewEnabled()
. Ол алдын ала қарау мүмкіндіктерінің қосылған-қосылмағанын хабарлайды. Бұл қызықты, себебі жоғарыда аталған annotation@PreviewFeature
JDK 14 шығарылғанға дейін қолжетімді болмайды. DocumentBuilderFactory
және аттар кеңістігін ескеретін даналарды жасаудың үш жаңа әдісінSAXParserFactory
алыңыз .javax.xml.parsers
GO TO FULL VERSION