Биз жаңы JDK релизинин алты ай сайын чыгып турганына көнүп калганбыз. Азырынча бул ыкма өзүн актады жана кээ бир иштеп чыгуучулардын жаңылануулардан артта калбайбыз деген кооптонуусу текке кетти: алты айлык өзгөрүүлөр аз жана алар мурдагыдай глобалдуу эмес. Жаңы келген программисттер жаңылыкты таптакыр байкабай калышы мүмкүн. Бирок, келечектеги программалык камсыздоону иштеп чыгуучулар жаңылыктардан кабардар болгон жакшы. Бул макалада биз салттуу түрдө кабыл алынган узартуу сунуштарын (JEPs) сүрөттөп беребиз. Java 13 беш гана JEP жана 76 жаңы негизги китепкана элементтерин камтыйт (алардын дээрлик жарымы java.io пакетине жөнөкөй толуктоолор).
JEP 355 : Текст блоктору (Алдын ала көрүү)
Тилдин синтаксисин өзгөртүүдөн баштайлы. Алардын эң маанилүүсү текст блоктору. Алар символдордон качууга жана саптарды кантип форматтоо керектигин билүүгө мүмкүндүк берет. JDK 12 сап литералдары менен иштөө үчүн күтүлгөн Raw String Literals (JEP 326) өзгөчөлүгүн камтыбаганы эсиңизде болсо керек . Java 13, ал текст блоктору менен JEP 355 менен алмаштырылган. Сиз Java тorнде сап кош тырмакчага оролуп турганын эсиңизде болсо керек. Бул жакшы, бирок маселе бул сызык баштапкы файлдын бирден ашык сабын ээлей алbyte (Java сызыгы менен чаташтырбоо үчүн, бул жерде биз файл сызыгын "сап" деп атайбыз). Келгиле, айланып чыгалы, мисалы,\n
тыныгуу керек болсо символду же көп саптуу туюнтмаларды бириктирүүнү колдонолу. Бул абдан жакшы эмес! HTML, XML, SQL же JSON фрагменттери камтылган текст литералдары өзгөчө түйшүктүү. Мунун баары качуу, бириктирүү жана кол менен түзөтүү codeду жазууну ыңгайсыз жана окууну кыйындатат. Текст блоктору бул маселени чечүүгө аракет кылышат. Алар уh... үч кош тырмакча менен башталып, алар менен бүтүшөт (мен билем, бул анча жакшы эмес угулат). Тырмакчалардын ортосундагы бардык нерсе саптын бир бөлүгү, анын ичинде жаңы саптар катары чечмеленет. Текст блокторун стандарттык текст литералдары сыяктуу эле колдонсо болот жана 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>
""";
Текст блокторун колдонууда бorп алуу жакшы болгон бир нече кылдаттыктарды айта кетели. Жабуучу тырмакчаларды жайгаштыруу маанилүү болуп чыкты: ал анда-санда ак мейкиндиктин кандайча иштетилгенин аныктайт. Жогорудагы мисалда, жабуу тырмакчалары HTML текстинин чегиниши менен дал келет. Бул учурда, компилятор чегинүү мейкиндиктерин алып салат жана натыйжада биз төмөнкүдөй сапты алабыз:
<html>
<body>
<p>My web page</p>
</body>
</html>
Көңүл буруңуздар:мындай сап саптын аягында жаңы сапты камтыйт. Эгерде ал керек болбосо, жабуучу тырмакчаларды “”” түз эле </html> тегинен кийин коюуга болот. Эгерде биз жабуу тырмакчаларын сол четке жакыныраак жылдырсак, бул алынып салынган чегинүүлөрдүн көлөмүн өзгөртөт. Эгерде биз аларды солго эки боштукка жылдырсак, ар бир сап сызыгына чегинүү үчүн эки боштук кошобуз. Сол четине жылдырсаңыз, бардык толтургучтар сакталат. Тырмакчаларды оңго жылдыруу эч кандай натыйжа бербейт жана башка чегинүүлөрдү кошпойт. Текст блоктору JDK 13 программасына алдын ала көрүү мүмкүнчүлүгү катары киргизилген. Бул алар азырынча тиешелүү Java тorнин спецификациясына киргизиле элек дегенди билдирет. Башкача айтканда, бул өзгөчөлүк тилдин туруктуу бөлүгү болуп калабы же бул жерде жөн эле конокпу, белгисиз. Учурда иштеп чыгуучулар функцияны сынап көрүп, ал боюнча өз пикирин билдире алышат. Текст блоктордун тагдыры андан көз каранды болот: өзгөчөлүктү жакшыртса болот, эгер сизге жакпаса, анда аны толугу менен алып салууга болот. Эгер сиз текст блокторун иш жүзүндө сынап көргүңүз келсе, компиляция жана иштетүү үчүн алдын ала көрүү функциялары ачык камтылышы керек экенин унутпаңыз. Компиляция:
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 тor да шартсыз секирүү оператору сыяктуу белги менен 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 Virtual Machine менен байланышкан.
JEP 350 динамикалык CDS архиви
Бул кеңейтүү сизге Java тиркемесинин аткарылышынын аягында класстарды динамикалык түрдө архивдөөгө мүмкүндүк берет.class data sharing
CDS же Class Data Sharing демейки боюнча ушул эле класстардын тизмесин колдонуп, ишке киргизүүдө ишке киргизилген бардык класстарды атайын архивге топтоого мүмкүндүк берет . Бул тиркемелерди ишке киргизүүдө жана оперативдүү эстутумду үнөмдөөдө олуттуу ылдамdateуга алып келет. Мурда 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
. Ал мындан ары жергorктүү codeду талап кылbyte, бул ар кандай платформаларга өтүүнү жеңилдетет. Бул класс ошондой эле учурдагы буфердик кэш механизмин (бул максат үчүн жип стектин колдонуудан качуу) жана 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 чыкмайынча жеткorктүү болбойт. DocumentBuilderFactory
жана аттар мейкиндигин билген инстанцияларды түзүү үчүн үч жаңы ыкманыSAXParserFactory
алыңыз .javax.xml.parsers
GO TO FULL VERSION