JavaRush /Java блогы /Random-KK /Java 14: не жаңалық?

Java 14: не жаңалық?

Топта жарияланған
Әлемдік проблемалар - бұл әлемдік проблемалар, ал жаңа Java кестеге сәйкес келеді. Яғни, тура жарты жылда бір рет. Java 14 нұсқасының шығарылымы 17 наурызда шығарылды және әзірлеушілерге бағытталған тілге бірнеше қызықты жаңалықтар енгізді. Олардың ішінде жазбаJava 14: не жаңалық?  - 1 кілт сөзіне эксперименттік қолдау , « instanceof » операторында үлгі сәйкестігін қолдау , пайдаланушыға ыңғайлы NullPointerExceptions , мәтін блоктарын кеңейтілген «алдын ала қарау» , жаңартылған әдепкі қосқыш және т.б. бар. Естеріңізге сала кетейік, Java-дағы барлық инновациялар кеңейтім ұсыныстарынан басталады ( JEP, Java Enhancement Proposals ). Әзірлеушілер өзгертулер ұсынады, оларды «ресми» Java ата-аналары қарайды, содан кейін сол өзгерістердің кейбірі қабылданады, содан кейін олар JDK бөлігі болады. Ал қазір - барлығы туралы.

JEP 359: Жазбалар

Жазбалар деп те белгілі жазбалар JDK 14 үшін алдын ала қарау режимінде қолжетімді және бұл Java үшін мүлдем жаңа нәрсе. Шын мәнінде, біздің алдымызда Валхалла жобасы кезінде жасалған жаңа түрі бар . Жазбалар санауларға ұқсас және codeты жеңілдетуге мүмкіндік береді. Негізінде, олар күйі бар, бірақ мінез-құлқы жоқ сыныптарды ауыстырады. Қарапайым тілмен айтқанда, өрістер бар, әдістер жоқ. Сыныптар жағдайында біз кейде әрқашан қажет бола бермейтін көп қайталанатын codeтарды жазуға тура келеді: конструкторлар, аксессуарлар, equals(), hashCode(), toString() және т.б. Бұл қайталанатын codeты болдырмау үшін Java жоспарлайды. жазбаны пайдалану. Міне классикалық нұсқасы:
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-ке дейін, мысалы, келесі code болуы мүмкін:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
Көріп отырғаныңыздай, біз нысанды әдістерін қолданғымыз келетін сыныпқа шығаруымыз керек. Енді 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 енді қолжетімсіз болды. Javapackager орау құралы болды. Ол Java қолданбаларын барлық басқа «қалыпты» бағдарламалар сияқты орнатуға болатындай етіп пакеттеуге мүмкіндік берді. Мысалы, Windows пайдаланушылары үшін exe файлдарын жасаңыз және екі рет басу арқылы адам сияқты Java қолданбасын іске қосыңыз. Әрине, мұндай құрал өте жетіспейді, сондықтан JEP 343 жаңа құралды енгізді jpackage , ол Java қолданбасын барлық қажетті тәуелділіктерді қамтитын платформаға арнайы бумаға буады. Белгілі бір платформа үшін қолдау көрсетілетін пакет пішімдері:
  • Linux: deb және rpm
  • macOS: pkg және dmg
  • Windows: MSI және EXE

JEP 345: G1 үшін NUMA-қабылданатын жадты бөлу

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

JEP 349: JFR оқиғалар ағыны

Java Flight Recorder (JFR) қазір OpenJDK бөлігі болып табылады және сондықтан еркін қол жетімді. JDK 14 JFR оқиғаларын жылдам бақылауға арналған API қосады (JDK Flight Recorder), атап айтқанда белсенді және белсенді қолданбалардың үздіксіз мониторингін ұйымдастыру үшін. Ағынсыз опция үшін бірдей оқиғалар жазылады, үстеме шығысы 1%-дан аз. Осылайша оқиғалар ағынсыз опциямен бір уақытта ағынмен жіберіледі. Дегенмен, JEP 349 сәйкес тұтынушы үшін синхронды кері қоңырауларға рұқсат бермеуі керек. Тіпті аралық жадта сақталған жазбалардағы деректерге қол жеткізуге болмайды. Техникалық тұрғыдан jdk.jfr.consumer бумасы оқиғаларға асинхронды қатынасу мүмкіндігімен бірге jdk.jfr модулінде кеңейтіледі.

JEP 352: өзгермейтін салыстырылатын byte буферлері

Өздеріңіз білетіндей, Java NIO (New IO) File API JDK 1.4 нұсқасынан бері бар, содан кейін 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 нұсқаларында қол жетімді болды, бірақ тек алдын ала қарау мүмкіндігі ретінде, яғни ол әдепкі бойынша қосылмаған. Енді 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;
    }
};
Жаңа қосқышты пайдалану кезінде есте сақтау керек тағы бірнеше маңызды нәрселер бар s . Атап айтқанда, опциялар толық болуы керек екенін есте ұстаған жөн. Яғни, барлық мүмкін мәндер үшін сәйкес қосқыш белгісі болуы керек. yield енді кілт сөз болғандықтан , 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-ның ескі нұсқалары (JDK 14-ке дейін) өзгертусіз жұмыс істеуі керек. Егер сіз тарихқа әуес болсаңыз және соншалықты алыс емес өткен технологияларға қызығушылық танытсаңыз, Уикипедияға өтіп, SPARС архитектурасы туралы оқыңыз .

JEP 363: Concurrent Mark Sweep (CMS) қоқыс жинағышын алып тастаңыз

CMS қоқыс жинағышы (Concurrent Mark Sweep) жоюға бағытталған, себебі ол екі жыл бұрын ескірген деп белгіленіп, күтімсіз қалдырылған. Дегенмен, CMS GC қолданатын Java ескі нұсқаларының пайдаланушылары дем ала алады - бұл JEP мақсаты бұрынғы JDK шығарылымдарынан құрастырушыны жою емес. Бұған қоса, ParallelScavenge және SerialOld қоқыс жинау алгоритмдерінің («-XX:+UseParallelGC -XX:-UseParallelOldGC» опцияларымен жұмыс істейтін) тіркесімі ескірген.

JEP 364: macOS жүйесінде ZGC және Windows жүйесінде JEP 365: ZGC

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 қазірдің өзінде Windows жүйесінде, сонымен қатар эксперименттік режимде ZGC қолдауын қамтамасыз етеді. Ол келесідей:
  • Көп картаны жадты қолдау
  • Сақталған мекенжай кеңістігіне бет файлына негізделген жадты салыстыруды қолдау
  • Үйменің ерікті бөліктерін салыстыруға және шығаруға қолдау көрсету
  • Үйменің ерікті бөліктерін орындауға және босатуға қолдау көрсету

JEP 366: ParallelScavenge + SerialOld GC комбинациясын ескіру

Бұл JEP Parallel Scavenge және Serial Old қоқыс жинау алгоритмдерінің тіркесімін тоқтатады. Бұл комбинацияны -XX: + UseParallelGC -XX: -UseParallelOldGC пәрмен жолы параметрлері арқылы қолмен қосу керек болды. Authorлар комбинация өте нақты, бірақ сонымен бірге айтарлықтай техникалық қызмет көрсетуді қажет етеді деп санайды. Енді -XX: UseParallelOldGC опциясы ескірген және пайдаланылса, ескерту пайда болады.

JEP 367: Pack200 құралдары мен API жою

Pack200 – Java класының құрастырылған файлдарын сақтау үшін оңтайландырылған мұрағат пішімі. Бұл құрал Java 11 нұсқасынан бері ескірген деп белгіленді. Енді pack200, unpack200 және Pack200 API құралдары java.util.jar бумасынан жою үшін ресми түрде жарияланды . Бұл технология өте шектеулі өткізу қабілеттілігімен (модемдер, айту және есте сақтау қорқынышты, 56к) және қатты дискілердегі жеткіліксіз сақтау орнымен күресу құралы ретінде Java 5-те енгізілді. Біраз уақыт бұрын Java 9 жаңа қысу схемаларын ұсынды. Әзірлеушілер jlink пайдалану ұсынылады .

JEP 368: Мәтін блоктары (екінші алдын ала қарау)

Мәтіндік блоктар алғаш рет Java 13-де пайда болды. Олар көп жолды жол литералдары болып табылады, олар көптеген шығу реттіліктерінің қажеттілігін болдырмайды, жолды автоматты түрде пішімдейді және қажет болған жағдайда әзірлеушіге жолды пішімдеуге мүмкіндік береді. Бұл пайдалы мүмкіндік енді Java 14 (2-ші алдын ала қарау) нұсқасында қол жетімді. Мәтіндік блоктардың негізгі мақсаты шатастыратын көп жолды литералдармен жұмыс істеуді жақсарту болып табылады. Бұл 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-тің жаңа мүмкіндіктерін қолданып көруді ұмытпаңыз, ол тіпті жаңадан бастағандар үшін де өте пайдалы. Оқуларыңызға сәттілік!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION