JavaRush /Java блогу /Random-KY /Java 14: эмне жаңылык?

Java 14: эмне жаңылык?

Группада жарыяланган
Дунйэ пробле-малары дунйэ пробле масыдыр, тэзе Ява график боюнча. Башкача айтканда, туура алты айда бир жолу. Java 14тун релиз versionсы 17-мартта чыгып, иштеп чыгуучуларга багытталган тилге бир нече кызыктуу инновацияларды киргизди. Алардын арасында рекордJava 14: эмне жаңылык?  - 1 ачкыч сөзү үчүн эксперименталдык колдоо, " instanceof " операторунда үлгү дал келүүнү колдоо , колдонууга ыңгайлуу NullPointerExceptions , текст блокторун кеңейтилген "алдын ала көрүү" , жаңыртылган демейки алмаштыргыч жана башкалар бар. Эске сала кетсек, Javaдагы бардык инновациялар кеңейтүү сунуштарынан башталат ( JEP, Java Enhancement Proposals ). Иштеп чыгуучулар өзгөртүүнү сунушташат, аларды “расмий” Java ата-энелери карап чыгышат, андан кийин ал өзгөртүүлөрдүн айрымдары кабыл алынат, андан кийин алар JDKнын бир бөлүгү болуп калышат. Ал эми азыр - бардыгы жөнүндө.

JEP 359: Жазуулар

Жазуулар, ошондой эле Records катары белгилүү, JDK 14 үчүн алдын ала көрүү режиминде жеткorктүү жана бул Java үчүн таптакыр жаңы нерсе. Чынында, биздин алдыбызда Valhalla долбоору учурунда иштелип чыккан жаңы түрү бар . Жазуулар санактарга окшош жана codeуңузду жөнөкөйлөтүүгө мүмкүндүк берет. Негизинен, алар абалы бар, бирок жүрүм-туруму жок класстарды алмаштырышат. Жөнөкөй сөз менен айтканда, талаалар бар, ыкмалар жок. Класстарда биз кээде көп кайталануучу codeду жазууга туура келет, алар дайыма эле зарыл боло бербейт: конструкторлор, аксессуарлар, equals(), hashCode(), toString() ж.б. Бул кайталануучу codeду болтурбоо үчүн 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
Жазуулар чектөөлөр менен болсо да, класстар болуп саналат. Алар башка класстарды кеңейте алbyte же талааларды жарыялай алbyte (мамлекеттик декларациянын компоненттерине туура келген жеке финалдан тышкары). Жазуулар кыйыр түрдө акыркы болуп саналат жана абстракттуу боло алbyte. Жазуулар кадимки класстардан айырмаланат, анткени алар APIди анын өкүлчүлүгүнөн ажырата алbyte. Бирок эркиндикти жоготуу тактыктын жогорулашы менен толтурулат. Жазуу компоненттери да кыйыр түрдө акыркы болуп саналат.

JEP 305: Үлгү дал келүү (Алдын ала көрүү)

Java 14-де алдын ала көрүү режиминде киргизилген Үлгү дал келүү өзгөчөлүгү an objectтин түрүн текшерүүнү жана instanceof операторунда анын конversionсын айкалыштыруу үчүн иштелип чыккан . Башка сөз менен айтканда, Java 14 чейин, мисалы, төмөнкү code болмок:
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де JavaFX үчүн иштелип чыккан javapackager куралы болгон. Бирок, JDK 11 чыгарылышы менен JavaFX Javaдан бөлүнгөндөн кийин, популярдуу javapackager мындан ары жеткorктүү болбой калды. Javapackager пакеттөө куралы болгон. Бул Java тиркемелерин башка бардык "кадимки" программалар сыяктуу орното тургандай пакеттөө мүмкүнчүлүгүн берди. Мисалы, Windows колдонуучулары үчүн exe файлдарын түзүп, адам сыяктуу Java тиркемесин эки жолу чыкылдатыңыз. Албетте, мындай курал абдан жетишсиз, ошондуктан JEP 343 Java тиркемесин бардык керектүү көз карандылыктарды камтыган платформанын спецификалык пакетине топтогон jpackage деген жаңы куралды киргизди . Белгилүү платформа үчүн колдоого алынган пакет форматтары:
  • Linux: deb жана rpm
  • macOS: pkg жана dmg
  • Windows: MSI жана EXE

JEP 345: G1 үчүн NUMA-бorмдүү эстутум бөлүштүрүү

JEP 345 NUMA (Бирдиктүү эмес эстутум мүмкүнчүлүгү) колдоосун ишке ашыруу үчүн гана кызмат кылат. Бул эстутумга кирүүнүн гетерогендүү архитектуралары, микропроцессордук кластерди мультипроцессордук системага орнотуу ыкмасы, мында эстутум локалдык түрдө бөлүштүрүлөт: ар бир процессордун өзөгү аз өлчөмдө локалдык эстутумду алат, ал эми башка өзөктөр ага жетүү мүмкүнчүлүгүнө ээ. JEP 345 G1 таштанды жыйгычын ушундай архитектураларды колдонуу мүмкүнчүлүгү менен жабдууну пландаштырууда. Башка нерселер менен катар, бул ыкма абдан күчтүү машиналарда иштөөнү жакшыртууга жардам берет.

JEP 349: JFR окуя агымы

Java Flight Recorder (JFR) азыр OpenJDKнин бир бөлүгү жана ошондуктан эркин жеткorктүү. JDK 14 JFR окуяларына тез көз салуу үчүн API кошот (JDK Flight Recorder), атап айтканда жигердүү жана жигердүү эмес тиркемелерге үзгүлтүксүз мониторинг жүргүзүү үчүн. Ошол эле окуялар агымсыз опция үчүн катталган, кошумча чыгым 1% дан аз эмес. Ушундай жол менен окуялар агымсыз опция менен бир эле учурда агымдуу болот. Бирок, JEP 349 тиешелүү керектөөчү үчүн синхрондуу кайра чалууларга жол бербеши керек. Жада калса, аралык эстутумда сакталган жазуулардан алынган маалыматтар жеткorктүү болбошу керек. Техникалык жактан алганда, jdk.jfr.consumer пакети jdk.jfr модулундагы окуяларга асинхрондук кирүү мүмкүнчүлүгү менен кеңейтилет.

JEP 352: Учуучу эмес карталанган byte буферлери

Белгилүү болгондой, Java NIO (Жаңы IO) File API JDK 1.4тен бери иштеп келе жатат, андан кийин Path деп аталган жаңы өркүндөтүү киргизилген. Path - бул Java NIOдо иштегенде файлдын же каталогдун көрүнүшү катары java.io.File классын алмаштыруучу интерфейс. JEP 352 файл маалыматтарынын бир бөлүгүн туруксуз эстутумга (NVM) жүктөө үчүн MappedByteBuffer кеңейтет. Бул компьютер эстутуму, анда кубат өчүрүлгөн болсо да маалыматтар жоголбойт (көбүнчө окуу үчүн гана эс тутум деп аталат) маалыматтарды туруктуу сактоо үчүн колдонулат. Бул Java өркүндөтүү сунушу JDK API үчүн жаңы модулду жана классты камсыз кылат: jdk.nio.mapmode модулу, ал NVM шилтемеси менен карталанган byte буферлерин (MappedByteBuffer) түзүү үчүн жаңы режимдерди (READ_ONLY_SYNC, WRITE_ONLY_SYNC) сунуш кылат.

JEP 358: Пайдалуу NullPointerExceptions

NullPointerExceptions эми программистке ыңгайлуу болот. Өзгөчөлүктүн сүрөттөлүшү мурункуга караганда алда канча маалыматтуу болот деген мааниде. Себеби, JVM программалык byte-code көрсөтмөлөрүн так талдоону үйрөткөн жана ал кайсы өзгөрмө нөлдүк мааниге алып келерин көрсөтө алат. Бизде code бар дейли:
a.getMessage().getUserInfo().getName()
Акыркы 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-те жеткorктүү болгон, бирок алдын ала көрүү функциясы катары гана, башкача айтканда, демейки боюнча иштетилген эмес. Азыр JDK 14те баары кутудан чыгып иштейт. Java 14 которуштуруу блогунун жаңы жөнөкөйлөштүрүлгөн түрүн L -> ... этикеткалары менен киргизет.Жаңы форма кээ бир учурларда codeду жөнөкөйлөтөт. Бул жерде эки мисал болуп саналат. Бизде жуманын күндөрүн сүрөттөгөн өндүрүш бар дейли. Биз классикалык 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);
}
Сиз ошондой эле көп саптуу блокторду жазып, new 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 операциялык системасы жөнүндө эстеп калышы күмөн . Javaнын ата-энеси Sun Microsystems тарабынан түзүлгөн бул UNIX негизиндеги операциялык тутуму негизинен SPARC архитектурасындагы serverлер үчүн колдонулган... Бир чарчы сантиметрге өтө көп бейтааныш сөздөр барбы? Эч кандай чоң маселе жок: JEP 362 Solaris/SPARC, Solaris/x64 жана Linux/SPARC платформаларын колдоону токтотот. Башкача айтканда, алардын порттору азыр эскирди жана келечекте алар OpenJDKден алынып салынат. Бирок, Solaris/SPARC, Solaris/x64 жана Linux/SPARC портторуна байланыштуу Javaнын эски versionлары (JDK 14 чейин) өзгөртүүсүз иштеши керек. Эгер сиз тарыхка кызыккан адам болсоңуз жана анчалык алыс эмес өткөн технологияларга кызыксаңыз, Wikipediaга кирип, SPARС архитектурасы жөнүндө окуңуз .

JEP 363: Concurrent Mark Sweep (CMS) таштанды жыйгычты алып салыңыз

CMS таштанды жыйноочу (Concurrent Mark Sweep) алып салууга багытталган, анткени эки жыл мурун ал эскирген деп белгиленип, кароосуз калган. Бирок, CMS GC аркылуу Javaнын эски versionларынын колдонуучулары дем ала алышат - бул 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 MacOSко Z таштанды жыйгычты алып келет. JEPтин бир бөлүгү ошондой эле JEP 351де көрсөтүлгөндөй, колдонулбаган түзмөк эстутумун бошотуу үчүн коллектордук функцияны сүрөттөйт , бул Java 13тен бери болуп жатат. MacOS'та ZGC ишке ашыруу эки бөлүктөн турат:
  • MacOS'то көп карта эстутумун колдоо
  • үзгүлтүксүз эс брондоо үчүн ZGC колдоосу
JEP 365 ZGC үчүн Windowsта мурунтан эле колдоо көрсөтөт, ошондой эле эксперименталдык режимде. Ал төмөнкүдөй:
  • Көп карта эс тутумун колдоо
  • Барак файлынын негизинде сакталган дарек мейкиндигине эстутум картасын колдоо
  • Үймөктүн ыктыярдуу бөлүктөрүн картага түшүрүү жана картадан чыгаруу үчүн колдоо
  • Үймөктүн ыктыярдуу бөлүктөрүн жасоо жана чыгарууну колдоо

JEP 366: ParallelScavenge + SerialOld GC айкалышын жокко чыгаруу

Бул JEP Parallel Scavenge жана Serial Old таштанды чогултуу алгоритмдеринин айкалышын жокко чыгарат. Бул айкалыштыруу -XX: + UseParallelGC -XX: -UseParallelOldGC буйрук сабынын параметрлерин колдонуу менен кол менен иштетorши керек болчу. Жазуучулар айкалышы абдан спецификалык деп эсептешет, бирок ошондой эле олуттуу тейлөө күч-аракетин талап кылат. Ошентип, азыр -XX: UseParallelOldGC опциясы эскирди жана колдонулса эскертүү пайда болот.

JEP 367: Pack200 куралдарын жана APIди алып салыңыз

Pack200 – Java классынын компиляцияланган файлдарын сактоо үчүн оптималдаштырылган архив форматы. Бул курал Java 11ден бери эскирди деп белгиленген. Эми pack200, unpack200 жана Pack200 API куралдары java.util.jar пакетинен алынып салынганы расмий жарыяланды . Бул технология Java 5-те өтө чектелген өткөрүү жөндөмдүүлүгүн (модемдер, айтуу жана эстеп калуу коркунучтуу, 56к) жана катуу дисктерде сактагычтын жетишсиздиги менен күрөшүү каражаты катары киргизилген. Бир нече убакыт мурун, Java 9 жаңы кысуу схемаларын киргизген. Иштеп чыгуучуларга jlink колдонуу сунушталат .

JEP 368: Текст блоктору (экинчи алдын ала көрүү)

Текст блоктору биринчи жолу Java 13те пайда болгон. Алар көп саптык сап литералдары, алар көпчүлүк качуу ырааттуулугунун зарылдыгын алдын алат, сапты автоматтык түрдө форматтайт, ошондой эле керек болсо иштеп чыгуучуга сапты форматтоого мүмкүндүк берет. Бул пайдалуу функция азыр Java 14 (2-алдын ала көрүү) ичинде жеткorктүү. Тексттик блоктордун негизги максаты – башаламан көп саптуу литералдар менен иштөөнү жакшыртуу. Бул абдан SQL сурамдарын, HTML жана XML codeун жана 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 (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 Java колдонмолоруна жаңы MemorySegment, MemoryAddress жана MemoryLayout абстракцияларын колдонуу менен JVM үймөгүнөн тышкаркы эстутумдун аймактарына коопсуз жана натыйжалуу кирүүгө мүмкүндүк берген тышкы эстутумга мүмкүндүк алуу APIинин алдын ала кароосун камтыйт .

корутундулар

Анда эмне деп ойлойсуз? Java 13 менен салыштырганда, жаңы Java 14 ар кандай тармактарда көптөгөн маанилүү жакшыртууларды сунуш кылат. Кыязы, иштеп чыгуучулар үчүн эң маанилүүсү жаңыртылган коммутатор, кеңейтилген өзгөчөлүктөр NullPointerExceptions жана жазуулар болот. Же жокпу?.. Java 14 жаңы мүмкүнчүлүктөрүн сынап көрүүнү унутпаңыз, ал жаңы баштагандар үчүн да абдан пайдалуу. Сиздин изилдөө менен ийгorк коштосун!
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION