JavaRush /Блоги Java /Random-TG /Java 13: Хусусиятҳои нав

Java 13: Хусусиятҳои нав

Дар гурӯҳ нашр шудааст
Мо аллакай ба он одат кардаем, ки versionи нави 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 сатр дар нохунакҳои дукарата печонида мешавад. Ин хуб аст, аммо мушкилот дар он аст, ки сатр наметавонад зиёда аз як сатри файли сарчашмаро ишғол кунад (барои роҳ надодан ба иштибоҳ бо хати Java, дар ин ҷо мо хати файлро "хат" меномем). Хуб, биёед гирду атрофро гирем ва масалан, рамзеро, \nки агар танаффус лозим бошад, ё пайванди ифодаҳои бисёрсатрро истифода барем. На он қадар хуб баромад! Литералҳои матнӣ бо порчаҳои дохorи 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 тарҷума шудааст.
Ҷолиб он аст, ки ин усулҳо нав пайдо шуданд, аммо аллакай ҳамчун бекоршуда қайд карда шудаанд ... ин ҳолат нишон медиҳад, ки онҳо метавонанд дар versionи ояндаи JDK хориҷ карда шаванд. Илова кардани усули нав ва фавран аз он даст кашидан каме эксцентрикӣ ба назар мерасад. Аммо, лутфан қайд кунед, ки ин усулҳо бо хусусияти пешнамоиш алоқаманданд, ки метавонанд тағир ё хориҷ карда шаванд. Шояд ҷорӣ намудани эзоҳ @PreviewFeatureдар чунин ҳолатҳо кӯмак кунад, аммо он ҳанӯз ба JDK дохил карда нашудааст (гарчанде ки бо эҳтимолияти баланди он дар JDK 14 пайдо мешавад).

JEP 354 : Ифодаи гузариши (Пешнамоиш)

Java 12 пешниҳодро барои шакли нави навиштани ифодаҳо бо изҳороти гузариш - JEP 325 пешниҳод кард . Ин аввалин хусусияти пешнамоиш буд ва тақдири он исбот мекунад, ки пешниҳоди пешниҳодҳо ба корбарон як идеяи олӣ аст. Пеш аз JDK 12, switchон метавонад танҳо ҳамчун изҳороте истифода шавад, ки амалеро иҷро мекунад, аммо натиҷаро барнамегардонад. Аммо дар Java 12 он имкон дод, ки он ҳамчун ифодае истифода шавад switch, ки натиҷаеро бармегардонад, ки метавонад ба тағирёбанда таъин карда шавад. Дар синтаксиси изҳороти парванда дар дохor 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ба ҳар як гурӯҳи тамғакоғазҳои парванда фаромӯш кунем, мо ба гурӯҳи навбатии тамғакоғазҳои парванда пешфарз хоҳем кард. Ин метавонад ба хатогиҳое оварда расонад, ки пайдо кардан душвор аст. Дуюм, мо бояд ҳар як гурӯҳи аломатҳои парвандаро муайян кунем. Агар мо фаромӯш кунем, пас, албатта, мо хатои компиляторро мегирем, аммо ин вариант идеалӣ нест. Рамзи мо низ хеле муфассал аст, зеро ҳар як арзиш dayOfWeekбояд тамғаи парвандаи худро дошта бошад. Бо истифода аз синтаксиси нав, мо рамзи хеле тозатар ва камтар ба хатогиҳо дучор мешавем:
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( ва continue) -ро бо нишона ба монанди оператори ҷаҳиши бешарт истифода баред goto. JEP 354 ин истифодаро тағир дод break, бинобар ин дар Java 13 рамзи мо каме тағир меёбад:
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 дарсҳоро ба таври динамикӣ бойгонӣ кунед. CDS ё Мубодилаи маълумотҳои синф ба шумо имкон медиҳад, ки ҳамаи синфҳои ҳангоми оғозёбӣ оғозшударо дар бойгонии махсус class data sharingбо истифода аз рӯйхати ҳамин синфҳо ба таври нобаёнӣ ҷойгир кунед. Ин ба суръатбахшии назаррас дар оғози барномаҳо ва сарфаи RAM оварда мерасонад. Қаблан, истифодаи AppCDS як раванди чандмарҳила буд, ки эҷоди рӯйхати синфҳои мувофиқ ва истифодаи он рӯйхатро барои эҷоди бойгонӣ, ки барои иҷроҳои минбаъда истифода мешавад, дар бар мегирифт. Акнун танҳо як ба кор андохтани барнома бо -XX: парчам, ки ArchiveClassesAtExitмакони сабти бойгониро нишон медиҳад, лозим аст. Бо ин равиш, пас аз қатъи муқаррарии барнома, синфҳо ба таври худкор ба бойгонӣ баста мешаванд.

JEP 351 ZGC : Хориҷ кардани хотираи истифоданашуда

Як сол пеш, JDK 11 ZGC, як коллектори партовҳои таҷрибавӣ, миқёспазир ва таъхирнопазирро муаррифӣ кард. Дар аввал, ZGC хеле аҷиб рафтор кард: он имкон намедод, ки хотира ба системаи оператсионӣ баргардонида шавад, ҳатто агар он дигар лозим набошад. Барои баъзе муҳитҳо, ба монанди контейнерҳо, ки захираҳо дар як вақт аз ҷониби хидматҳои гуногун истифода мешаванд, ин метавонад миқёспазирӣ ва самаранокии системаро маҳдуд кунад. Тӯдаи ZGC аз ба ном ZPages иборат аст. Вақте ки ZPages дар давоми давраи ҷамъоварии ахлот тоза карда мешаванд, онҳо ба ZPageCache баргардонида мешаванд. ZPages дар ин кэш аз рӯи чанд вақт истифода шудани онҳо тартиб дода мешаванд. Дар Java 13, ZGC саҳифаҳоеро, ки барои муддати тӯлонӣ истифода нашудаанд, ба системаи оператсионӣ бармегардонад. Бо ин роҳ онҳо метавонанд барои равандҳои дигар дубора истифода шаванд.

JEP 353 API-и кӯҳнашудаи Socketро аз нав татбиқ кунед

Ҳарду татбиқи API ҳоло ҳам JDK 1.0 java.net.Socketмебошанд . java.net.ServerSocketДар ин ва ҳамаи JDK-ҳои минбаъда, татбиқи ин APIҳо якчанд усулҳоро истифода мебарад (масалан, истифодаи стеки ришта ҳамчун буфери I/O), ки нигоҳдории онҳоро чандир ва душвор мегардонад. Барои ҳалли ин мушкилот, татбиқи нав дар JDK 13 пешниҳод карда шуд NioSocketImpl. Он дигар codeи модариро талаб намекунад ва интиқолро ба платформаҳои гуногун осон мекунад. Ин синф инчунин механизми кэши буферии мавҷударо истифода мебарад (аз истифодаи стек ришта барои ин мақсад худдорӣ мекунад) ва қулфкунӣ java.util.concurrentна усулҳои ҳамоҳангшуда. Ин ҳамгироиро бо нахҳои Project Loom содда мекунад .

API-ҳои нав

Мо қаблан зикр кардем, ки Java 13 дар китобхонаҳои синфи базавӣ 76 API-и навро дар бар мегирад. Онҳо соҳаҳои зеринро фаро мегиранд:
  • Навсозиҳои дастгирии Юниcode.
  • Се усули нави Stringдастгирии блокҳои матнӣ (нигаред ба тавсифи JEP 255 дар боло).
  • Синфҳо java.nioҳоло мутлақ доранд (бар хилофи нисбӣ) getва set-методы. Они, How и базовый абстрактный класс Buffer, включают метод slice() для извлечения части буфера.
  • Метод force() класса MappedByteBuffer принудительно записывает раздел буфера в его резервное хранorще.
  • nio.FileSystem добавляет три новые перегруженные формы newFileSystem() для доступа к содержимому file How файловой системы.
  • В javax.annotation.processing.ProcessingEnvironment появился новый интересный метод. isPreviewEnabled(). Он сообщит о том, включены ли preview-фичи. Это интересно потому, что упомянутая выше annotation @PreviewFeature не будет доступна до выхода JDK 14.
  • DocumentBuilderFactory и SAXParserFactory в javax.xml.parsers получают три новых метода для создания экземпляров, поддерживающих пространство имен.
Материал основан на статье Саймона Риттера и официальной documentации.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION