JavaRush /Java блогу /Random-KY /Java 13: Жаңы мүмкүнчүлүктөр

Java 13: Жаңы мүмкүнчүлүктөр

Группада жарыяланган
Биз жаңы JDK релизинин алты ай сайын чыгып турганына көнүп калганбыз. Азырынча бул ыкма өзүн актады жана кээ бир иштеп чыгуучулардын жаңылануулардан артта калбайбыз деген кооптонуусу текке кетти: алты айлык өзгөрүүлөр аз жана алар мурдагыдай глобалдуу эмес. Жаңы келген программисттер жаңылыкты таптакыр байкабай калышы мүмкүн. Java 13: жаңы мүмкүнчүлүктөр - 1Бирок, келечектеги программалык камсыздоону иштеп чыгуучулар жаңылыктардан кабардар болгон жакшы. Бул макалада биз салттуу түрдө кабыл алынган узартуу сунуштарын (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 маанисине которулган качуу ырааттуулугу (мисалы, ) менен сапты кайтарат .
Кызыктуусу, бул ыкмалар жаңы эле пайда болгон, бирок эскирген деп белгиленген ... Бул абал аларды JDKнын келечектеги versionсында алып салууга мүмкүн экенин көрсөтүп турат. Жаңы ыкманы кошуп, андан дароо баш тартуу бир аз эксцентрик окшойт. Бирок, бул ыкмалар өзгөртүлүшү же жок кылынышы мүмкүн болгон алдын ала көрүү өзгөчөлүгү менен байланыштуу экенин эске алыңыз. Балким, annotationны киргизүү @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 бир аз өзгөрөт: 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 Virtual Machine менен байланышкан.

JEP 350 динамикалык CDS архиви

Бул кеңейтүү сизге Java тиркемесинин аткарылышынын аягында класстарды динамикалык түрдө архивдөөгө мүмкүндүк берет. class data sharingCDS же 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.FileSystemnewFileSystem()файлдык система катары файлдын мазмунуна кирүү үчүн үч жаңы ашыкча жүктөлгөн форманы кошот .
  • Жаңы кызыктуу ыкма пайда болду javax.annotation.processing.ProcessingEnvironment. isPreviewEnabled(). Ал алдын ала көрүү функциялары иштетилгенби же жокпу айтып берет. Бул кызыктуу, анткени жогоруда айтылган annotation @PreviewFeatureJDK 14 чыкмайынча жеткorктүү болбойт.
  • DocumentBuilderFactoryжана аттар мейкиндигин билген инстанцияларды түзүү үчүн үч жаңы ыкманы SAXParserFactoryалыңыз .javax.xml.parsers
Материал Саймон Риттердин макаласына жана расмий documentтерге негизделген .
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION