JavaRush /Блоги Java /Random-TG /Java 14: чӣ нав аст?

Java 14: чӣ нав аст?

Дар гурӯҳ нашр шудааст
Проблемахои чахон пробле-махои чахон мебошанд ва Яваи нав дар график. Яъне, маҳз дар шаш моҳ як маротиба. Варианти барориши Java 14 17 март бароварда шуд ва якчанд навовариҳои ҷолибро ба забоне, ки ба таҳиягарон нигаронида шудааст, ҷорӣ кард. Java 14: чӣ нав аст?  - 1Дар байни онҳо дастгирии таҷрибавӣ барои калимаи калидии сабт , дастгирии мувофиқати намуна дар оператори " instanceof ", NullPointerExceptions барои корбар осонтар , "пешнамоиши" васеъшудаи блокҳои матнӣ , гузариши пешфарзии навшуда ва ғайра мебошанд. Ёдовар мешавем, ки ҳама навовариҳо дар Java бо пешниҳодҳои васеъшавӣ оғоз мешаванд ( JEP, Java Enhancement Proposals ). Таҳиягарон тағиротро пешниҳод мекунанд, онҳо аз ҷониби волидайни "расмӣ" Java баррасӣ карда мешаванд ва сипас баъзе аз ин тағиротҳо қабул карда мешаванд ва пас аз он онҳо қисми JDK мешаванд. Ва ҳоло - дар бораи ҳама чиз бо тартиб.

JEP 359: Сабтҳо

Сабтҳо, ки бо номи Сабтҳо низ маълуманд, барои JDK 14 дар ҳолати пешнамоиш дастрасанд ва ин барои Java чизи комилан нав аст. Дар асл, мо дар назди мо як навъи нав дорем, ки дар давоми лоиҳаи Valhalla таҳия шудааст . Сабтҳо ба рӯйхатҳо монанданд ва ба шумо имкон медиҳанд, ки рамзи худро содда кунед. Аслан, онҳо синфҳоеро иваз мекунанд, ки ҳолат доранд, аммо рафтор надоранд. Оддӣ карда гӯем, майдонҳо ҳастанд, усулҳо вуҷуд надоранд. Дар мавриди дарсҳо, мо баъзан маҷбур мешавем, ки бисёр codeҳои такрорӣ нависем, ки на ҳамеша лозим аст: созандаҳо, accessors, equals(), hashCode(), toString() ва ғайра. Барои пешгирӣ кардани ин рамзи такрорӣ Java нақша дорад. сабтро истифода баранд. Ин аст versionи классикӣ:
final class Triangle {
 	public final int x;
public final int y;
public final int z;

    public Triangle(int x, int y, int z) {
         this.x = x;
         this.y = y;
    this.z = z;
    }
    // equals, hashCode, toString
Биёед ба Java 14 гузарем ва сабтро истифода барем:
public record Triangle(int x, int y, int z){}
Ҳамааш ҳамин. Лутфан таваҷҷӯҳ намоед, ки сабтҳо дар айни замон дар шакли пешнамоиш мавҷуданд, бинобар ин барои санҷидани онҳо дар амал шумо бояд jdk14-ро зеркашӣ кунед ва фармонро ворид кунед:
javac —enable-preview —release 14 Triangle.java
Сабтҳо синфҳо ҳастанд, ҳарчанд бо маҳдудиятҳо. Онҳо наметавонанд синфҳои дигарро васеъ кунанд ё майдонҳоро эълон кунанд (ба истиснои ниҳоии хусусие, ки ба ҷузъҳои эъломияи давлатӣ мувофиқанд). Сабтҳо комилан ниҳоӣ мебошанд ва абстрактӣ буда наметавонанд. Сабтҳо аз синфҳои муқаррарӣ бо он фарқ мекунанд, ки онҳо API-и худро аз намояндагии он ҷудо карда наметавонанд. Аммо аз даст додани озодӣ бо дақиқии зиёд ҷуброн карда мешавад. Ҷузъҳои сабт низ ба таври возеҳ ниҳоӣ мебошанд.

JEP 305: Мутобиқсозии намуна барои мисол (Пешнамоиш)

Хусусияти Мутобиқсозии намуна , ки дар Java 14 дар пешнамоиш муаррифӣ шудааст, барои якҷоя кардани тафтиши навъи an object ва табдилдиҳии он дар оператори instanceof тарҳрезӣ шудааст . Ба ибораи дигар, пеш аз Java 14, масалан, рамзи зерин вуҷуд дошт:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
Тавре ки шумо мебинед, мо бояд an objectро ба синфе гузорем, ки методҳояшро истифода бурдан мехоҳем. Ҳоло Java 14 ва хусусияти мутобиқати намунаи пайвастшуда ба шумо имкон медиҳад, ки codeро ба зерин кам кунед:
Object object = Violin;

if (object instanceof Instrument instrument){
    System.out.println(instrument.getMaster());
}

JEP 343: Воситаи бастабандӣ (Инкубатор)

JDK 8 асбоби javapackager дошт , ки барои JavaFX пешбинӣ шудааст. Аммо, пас аз ҷудо шудани JavaFX аз Java бо нашри JDK 11, javapackager маъмул дигар дастрас набуд. Javapackager воситаи бастабандӣ буд. Он имкон дод, ки барномаҳои Java ба тарзе бастабандӣ шаванд, ки онҳо мисли дигар барномаҳои "муқаррарӣ" насб карда шаванд. Масалан, барои корбарони Windows файлҳои exe эҷод кунед ва як барномаи Java-ро ба мисли инсон оғоз кунед - бо клики дукарата. Албатта, чунин асбоб хеле кам аст, аз ин рӯ JEP 343 як абзори нав, jpackage -ро ҷорӣ кард , ки барномаи Java-ро ба бастаи махсуси платформаи дорои ҳама вобастагии зарурӣ бастааст. Форматҳои бастаи дастгирӣшаванда барои платформаи мушаххас:
  • Linux: deb ва rpm
  • macOS: pkg ва dmg
  • Windows: MSI ва EXE

JEP 345: Тақсимоти хотираи NUMA-хабар барои G1

JEP 345 танҳо барои татбиқи дастгирии NUMA (дастрасии хотираи ягона) хидмат мекунад. Инҳо меъмории дастрасии гетерогении хотира мебошанд, ки як роҳи ташкor кластери микропросессорӣ ба системаи бисёрпросессорӣ, ки дар он хотира метавонад ба таври маҳаллӣ тақсим карда шавад: ҳар як ядрои протсессор миқдори ками хотираи маҳаллӣ мегирад, дар ҳоле ки ядроҳои дигар ба он дастрасӣ доранд. JEP 345 нақша дорад, ки коллектори партовҳои G1-ро бо қобorяти истифодаи чунин меъморӣ муҷаҳҳаз созад. Дар байни чизҳои дигар, ин равиш ба беҳтар кардани кор дар мошинҳои хеле пурқувват кӯмак мекунад.

JEP 349: Ҷараёни рӯйдодҳои JFR

Java Recorder Flight Recorder (JFR) ҳоло як қисми OpenJDK мебошад ва аз ин рӯ ба таври ройгон дастрас аст. JDK 14 API-ро барои пайгирии фаврии рӯйдодҳои JFR (JDK Flight Recorder), аз ҷумла барои ташкor мониторинги пайвастаи барномаҳои фаъол ва ғайрифаъол илова мекунад. Ҳодисаҳои якхела, ки барои опсияи ғайри ҷараён, бо хароҷоти изофӣ камтар аз 1% сабт карда мешаванд. Бо ин роҳ, рӯйдодҳо дар як вақт бо варианти бидуни ҷараён пахш карда мешаванд. Аммо, JEP 349 набояд зангҳои синхронӣ барои истеъмолкунандаи мувофиқ иҷозат диҳад. Ҳатто маълумот аз сабтҳои дар хотираи фосилавӣ нигоҳ дошташуда набояд дастрас бошад. Аз ҷиҳати техникӣ, бастаи jdk.jfr.consumer дар модули jdk.jfr бо функсия барои дастрасии асинхронӣ ба рӯйдодҳо васеъ карда мешавад.

JEP 352: Буферҳои byteӣ хариташудаи ғайридавлатӣ

Тавре ки мо медонем, Java NIO (New IO) File API аз JDK 1.4 вуҷуд дорад ва сипас такмor нав бо номи Path ҷорӣ карда шуд. Роҳ интерфейсест, ки синфи java.io.File-ро ҳамчун намоиши файл ё директория иваз мекунад, вақте ки мо дар Java NIO кор мекунем. JEP 352 MappedByteBuffer-ро барои бор кардани як қисми маълумоти файл ба хотираи ғайридавлатӣ (NVM) васеъ мекунад. Ин хотираи компютер, ки дар он маълумот ҳатто ҳангоми хомӯш кардани барқ ​​(аксар вақт хотираи танҳо барои хондан номида мешавад) гум намешавад, барои нигоҳдории доимии маълумот истифода мешавад. Ин пешниҳоди такмилдиҳии Java модул ва синфи навро барои API JDK таъмин мекунад: модули jdk.nio.mapmode, ки шеваҳои навро (READ_ONLY_SYNC, WRITE_ONLY_SYNC) барои эҷоди буферҳои byteҳои хариташуда (MappedByteBuffer) бо истинод ба NVM пешниҳод мекунад.

JEP 358: Истисноҳои муфид NullPointer

NullPointerExceptions акнун ба барномасозон бештар дӯстона хоҳад буд. Ба ин маъно, ки тавсифи истисно нисбат ба пештара хеле иттилоотӣ хоҳад буд. Сабаб дар он аст, ки ба JVM таълим дода шудааст, ки дастурҳои bytecodeи барномаро дақиқтар таҳлил кунад ва он метавонад нишон диҳад, ки кадом тағирёбанда ба арзиши сифр оварда мерасонад. Биёед бигӯем, ки мо code дорем:
a.getMessage().getUserInfo().getName()
Дар ҳама гуна versionи охирини Java мо сабти хатогиҳои муқаррариро мегирем, ки ба саволи он ки кӣ маҳз ботил аст, ҷавоб намедиҳад:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
Ва ин аст он чизе ки Java 14 ба шумо медиҳад, агар шумо қарор диҳед, ки ин хусусияти пешнамоишро санҷед:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "UserInfo().getName()" because the return value of "Message().getUserInfo()" is null
	at Main.main(Main.java:12)
Ин занҷир хеле фаҳмотар аст ва ба шумо имкон медиҳад, ки хатогиро зудтар ҳал кунед.

JEP 361: Ифодаҳоро иваз кунед (стандартӣ)

Оператори таҷдидшудаи Switch дар Java 12 ва 13-и қаблӣ дастрас буд, аммо танҳо ҳамчун хусусияти пешнамоиш, яъне он бо нобаёнӣ фаъол карда нашудааст. Ҳоло дар JDK 14 ҳама чиз аз қуттӣ кор мекунад. Java 14 шакли нави соддакардашудаи блоки коммутаторро бо аломатҳои L -> ... ҷорӣ мекунад.Формаи нав дар баъзе ҳолатҳо codeро содда мекунад. Ана як-ду мисол. Фарз мекунем, ки мо рақаме дорем, ки рӯзҳои ҳафтаро тавсиф мекунад. Мо метавонем рамзи классикиро нависем (пеш аз Java 14):
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
Ва ин ҷо як вариант бо истифода аз Java 14:
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
Шумо инчунин метавонед блокҳои бисёрсатрӣ нависед ва арзишро бо калимаи нави yield баргардонед:
int result = switch (s) {
    case "Working from Home" -> 1;
    case "Working from Office" -> 2;
    default    -> {
        System.out.println("Neither Home nor Office… Cafe? Car? Park?...");
        yield 0;
    }
};
Якчанд чизҳои муҳими дигаре ҳастанд, ки ҳангоми истифодаи коммутаторҳои нав бояд дар хотир нигоҳ дошта шаванд . Махсусан, шумо бояд дар хотир доред, ки вариантҳо бояд пурра бошанд. Яъне барои ҳамаи арзишҳои имконпазир бояд тамғаи мувофиқи гузариш мавҷуд бошад. Азбаски ҳосил ҳоло калимаи калидӣ аст, дар Java 14 синф бо номи yield имконпазир аст. Умуман, агар шумо хоҳед, ки чӣ тавр истифода бурдани коммутаторҳои навшударо омӯзед, ба JEP 361 гузаред ва омӯзед. Дар он ҷо бисёр маълумоти ҷолиб вуҷуд дорад.

JEP 362: Бандарҳои Solaris ва SPARC-ро бекор кунед

Аз эҳтимол дур нест, ки бисёре аз хонандагони мо дар бораи системаи оператсионии Solaris дар ёд дошта бошанд . Ин системаи оператсионии дар асоси UNIX асосёфта, ки аз ҷониби волидони Java, Sun Microsystems сохта шудааст, асосан барои serverҳо дар меъмории SPARC истифода мешуд... Дар як сантиметри мураббаъ калимаҳои ношинос аз ҳад зиёданд? Ҳеҷ чизи муҳим нест: JEP 362 дастгирии платформаҳои Solaris/SPARC, Solaris/x64 ва Linux/SPARC-ро ба итмом мерасонад. Яъне, портҳои онҳо ҳоло бекор карда шудаанд ва дар оянда онҳо эҳтимолан аз OpenJDK хориҷ карда мешаванд. Аммо, versionҳои кӯҳнаи Java (пеш аз JDK 14) дар бораи бандарҳои Solaris/SPARC, Solaris/x64 ва Linux/SPARC бояд бидуни тағир кор кунанд. Агар шумо дӯстдори таърих бошед ва ба технологияҳои гузаштаи на он қадар дур таваҷҷӯҳ дошта бошед, ба Википедиа равед ва дар бораи меъмории SPARС хонед .

JEP 363: Ҷамъоварии партовҳои ҳамзамон Mark Sweep (CMS) -ро хориҷ кунед

Ҷамъоварии партовҳои CMS (Concurrent Mark Sweep) барои нест кардан равона карда шудааст, зеро ду сол пеш он ҳамчун кӯҳна қайд карда шуда буд ва бе нигоҳдорӣ монд. Аммо, корбарони versionҳои кӯҳнаи Java бо истифода аз CMS GC метавонанд нафас кашанд - ҳадафи ин JEP нест кардани созанда аз релизҳои қаблии JDK нест. Илова бар ин, омезиши алгоритмҳои ҷамъоварии партовҳои ParallelScavenge ва SerialOld (кор бо имконоти "-XX:+UseParallelGC -XX:-UseParallelOldGC" кор мекунад) бекор карда шудааст.

JEP 364: ZGC дар macOS ва JEP 365: ZGC дар Windows

Ҷамъоварии ҷолиби партов бо номи Z Garbage Collector (ZGC) мавҷуд аст . Он дар реҷаи ғайрифаъол кор мекунад ва кӯшиш мекунад, ки таъхирҳо аз сабаби ҷамъоварии ахлот кам карда шавад: вақти қатъ ҳангоми истифодаи ZGC аз 10 мс зиёд нест. Он метавонад бо тӯдаҳои хурд ва гигантҳо кор кунад (онҳое, ки тераbyteҳои зиёдро мегиранд). JEP 364 ва JEP 365 амалан дугониканд. JEP 364 Z Garbage Collector ба MacOS меорад. Қисми JEP инчунин функсияҳои коллекторро барои озод кардани хотираи истифоданашудаи дастгоҳ тавсиф мекунад, тавре ки дар JEP 351 нишон дода шудааст , ин аз Java 13 рух медиҳад. Татбиқи ZGC дар macOS аз ду қисм иборат аст:
  • Дастгирии хотираи бисёрхаритасозӣ дар macOS
  • Дастгирии ZGC барои захираи доимии хотира
JEP 365 дастгирии ZGC-ро аллакай дар Windows ва инчунин дар ҳолати таҷрибавӣ таъмин мекунад. Ин чунин аст:
  • Дастгирии хотираи бисёрхаритасозӣ
  • Дастгирии харитасозии хотира дар асоси файли саҳифа ба фазои суроғаи ҳифзшуда
  • Дастгирии харитасозӣ ва кушодани қисмҳои ихтиёрии теппа
  • Дастгирии содирот ва қатъ кардани қисмҳои худсаронаи теппа

JEP 366: Комбинатсияи ParallelScavenge + SerialOld GC-ро бекор кунед

Ин JEP маҷмӯи алгоритмҳои ҷамъоварии партовҳои Parallel Scavenge ва Serial Old-ро рад мекунад. Ин комбинат бояд бо истифода аз параметрҳои сатри фармон дастӣ фаъол карда шавад -XX: + UseParallelGC -XX: -UseParallelOldGC. Муаллифон боварӣ доранд, ки комбинатсияи хеле мушаххас аст, аммо инчунин кӯшиши назарраси нигоҳубинро талаб мекунад. Ҳамин тавр, ҳоло опсияи -XX: UseParallelOldGC бекор карда шудааст ва агар истифода шавад, огоҳӣ пайдо мешавад.

JEP 367: Tools Pack200 ва API-ро хориҷ кунед

Pack200 формати бойгониест, ки барои нигоҳ доштани файлҳои синфҳои Java тартиб дода шудааст. Ин асбоб аз замони Java 11 бекор карда шудааст. Ҳоло абзорҳои pack200, unpack200 ва Pack200 API барои хориҷ шудан аз бастаи java.util.jar расман эълон шудаанд . Ин технология дар Java 5 ҳамчун воситаи мубориза бо фарохмаҷрои хеле маҳдуд (модемҳо, гуфтан ва дар хотир доштан даҳшатнок аст, 56k) ва фазои нокифояи нигоҳдорӣ дар дискҳои сахт ҷорӣ карда шуд. Чанде пеш Java 9 схемаҳои нави фишурдасозиро ҷорӣ кард. Ба таҳиягарон тавсия дода мешавад, ки jlink -ро истифода баранд .

JEP 368: Блокҳои матнӣ (пешнамоиши дуюм)

Блокҳои матнӣ бори аввал дар Java 13 пайдо шуданд. Онҳо адабии сатри бисёрсатр мебошанд, ки зарурати аксари пайдарпаии фирорро пешгирӣ мекунанд, сатрро ба таври худкор формат мекунанд ва инчунин ба таҳиякунанда имкон медиҳанд, ки сатрро дар ҳолати зарурӣ формат кунад. Ин хусусияти муфид ҳоло дар Java 14 (пешнамоиши дуюм) дастрас аст. Мақсади асосии блокҳои матнӣ беҳтар кардани коркарди ҳарфҳои бисёрсатрӣ мебошад. Ин хондан ва навиштани дархостҳои SQL, codeи HTML ва XML ва JSON-ро хеле осон мекунад. Намунаи HTML бе блокҳои матнӣ:
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, JavaRush Student</p>\n" +
              "    </body>\n" +
              "</html>\n";
Чӣ тавр якхеларо бо блокҳои матнӣ нишон додан мумкин аст:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
Ҷудокунаки кушода ин пайдарпаии се аломати дукаратаи нохунак ("" "), пас аз сифр ё бештар фосилаҳо ва сипас ҷудокунандаи сатр мебошад. Мундариҷа аз аломати аввал пас аз ҷудокунандаи сатри ҷудокунандаи кушода оғоз мешавад. Ҷудокунаки пӯшида аст . пайдарпаии се аломати ду нохунак " _ ) интихоб карда шуданд, то ҳарфҳо бе гурехтан намоиш дода шаванд ва инчунин блоки матниро аз сатри аслӣ фарқ кунанд. Дар аввали соли 2019, JEP 355 блокҳои матниро ҳамчун идомаи JEP 326 (Literals Raw String) пешниҳод кард, аммо онҳо бозпас гирифта шуданд. Дар охири он сол, JDK 13 хусусияти пешнамоиши блоки матниро ҷорӣ кард ва ҳоло Java 14 ду пайдарпаии нави фирорро илова кардааст. Ин як хати-терминатор бо ишора \ ва дуюм барои фазои ягона аст, бо ишора /s. Намунаи истифодаи сатрҳои нав бидуни блокҳои матнӣ:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
Ва ҳоло бо пайдарпаии фирор \<line-terminator>:
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
Пайдарпаии фирор \s барои ҳисоб кардани фазои пасипар истифода мешавад, ки онро компилятор ба таври нобаёнӣ нодида мегирад. Он тамоми фазои холиеро, ки пеш аз он аст, нигоҳ медорад. Мисол:
String text1 = """
               line1
               line2 \s
               line3
               """;

String text2 = "line1\nline2 \nline3\n";
text1ва text2якхелаанд.

JEP 370: API-и дастрасӣ ба хотираи хориҷӣ (Инкубатор)

Бисёре аз китобхонаҳо ва барномаҳои маъмули Java ба хотираи беруна дастрасӣ доранд. Масалан, Ignite, MapDB, Memcached ва Netty ByteBuf API. Дар ин ҳолат, онҳо метавонанд аз хароҷот ва ғайричашмдошти марбут ба ҷамъоварии партовҳо канорагирӣ кунанд (махсусан ҳангоми хидматрасонии кэшҳои калон), мубодилаи хотира дар саросари равандҳои гуногун ва мундариҷаи хотираро тавассути харитасозии файлҳо дар хотира (масалан, бо истифода аз mmap) сериализатсия ва ғайрисериясозӣ кунанд. Аммо, Java API то ҳол ҳалли мувофиқ барои дастрасӣ ба хотираи беруна надорад. JDK 14 пешнамоиши API-и Access-Memory Access-ро дар бар мегирад , ки ба барномаҳои Java имкон медиҳад, ки бо истифода аз абстраксияҳои нави MemorySegment, MemoryAddress ва MemoryLayout ба минтақаҳои хотираи берун аз теппаи JVM ба таври бехатар ва самаранок дастрасӣ пайдо кунанд.

хулосахо

Пас шумо чӣ фикр доред? Дар муқоиса бо Java 13, Java 14 нав беҳбудиҳои муҳимтарро дар соҳаҳои гуногун пешкаш мекунад. Эҳтимол, муҳимтарин барои таҳиягарон гузариши навшуда, истисноҳои васеъшудаи NullPointerExceptions ва сабтҳо хоҳанд буд. Ё не?.. Санҷидани хусусиятҳои нави Java 14-ро фаромӯш накунед, он ҳатто барои шурӯъкунандагон хеле муфид аст. Муваффақият дар таҳсилатон!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION