Վեց ամիս մշակումից հետո Oracle-ը թողարկել է Java SE 22 հարթակը (Java Platform, Standard Edition 22), որն օգտագործում է բաց կոդով OpenJDK նախագիծը որպես իր հղման իրականացում: Բացառությամբ որոշ հնացած գործառույթների հեռացման, Java SE 22-ը պահպանում է հետադարձ համատեղելիությունը Java հարթակի նախորդ թողարկումների հետ. նախկինում գրված Java նախագծերի մեծ մասը կաշխատի անփոփոխ՝ նոր տարբերակով աշխատելիս: Java SE 22-ի տեղադրման պատրաստ տարբերակները (JDK, JRE և Server JRE) պատրաստ են... Linux (x86_64, AArch64), Windows (x86_64) և macOS (x86_64, AArch64): OpenJDK նախագծի կողմից մշակված Java 22 հղման իրականացումը լիովին բաց կոդով է՝ GPLv2 լիցենզիայի ներքո՝ GNU ClassPath Exception-ով, որը թույլ է տալիս դինամիկ կապ հաստատել առևտրային արտադրանքի հետ:
Java SE 22-ը դասակարգվում է որպես կանոնավոր աջակցությամբ թողարկում, որի թարմացումները թողարկվում են մինչև հաջորդ թողարկումը։ Երկարաժամկետ աջակցության (LTS) ճյուղը պետք է լինի Java SE 21 կամ Java SE 17, որոնք թարմացումներ կստանան համապատասխանաբար մինչև 2031 և 2029 թվականները (ընդհանուր առմամբ հասանելի են մինչև 2028 և 2026 թվականները): Java SE 11 LTS ճյուղի ընդհանուր աջակցությունն ավարտվեց անցյալ տարվա սեպտեմբերին, սակայն ընդլայնված աջակցությունը կշարունակվի մինչև 2032 թվականը։ Java SE 8 LTS ճյուղի ընդլայնված աջակցությունը կշարունակվի մինչև 2030 թվականը։
Հիշենք, որ Java 10-ի թողարկումից սկսած՝ նախագիծը անցավ նոր մշակման գործընթացի, ինչը ենթադրում է նոր թողարկումների ձևավորման ավելի կարճ ցիկլ։ Նոր ֆունկցիոնալությունն այժմ մշակվում է մեկ, անընդհատ թարմացվող գլխավոր ճյուղում, որը ներառում է պատրաստի փոփոխություններ և որից ճյուղերը ճյուղավորվում են յուրաքանչյուր վեց ամիսը մեկ՝ նոր թողարկումները կայունացնելու համար։
Java 22-ի նոր հնարավորությունները ներառում են.
- G1 աղբահավաքը աջակցում է տարածաշրջանի ամրացմանը, որը թույլ է տալիս Java օբյեկտներին ժամանակավորապես ամրացնել հիշողությանը, որպեսզի խուսափեն աղբահավաքի կողմից տեղաշարժվելուց և ապահովվի, որ այդ օբյեկտներին հղումները կարող են անվտանգ կերպով փոխանցվել Java-ի և բնօրինակ կոդի միջև։ Ամրացումը թույլ է տալիս նվազեցնել լատենտությունը և խուսափել աղբի հավաքագրման անջատումից՝ JNI-ի (Java Native Interface) կրիտիկական հատվածները (կրիտիկական շրջանները) բնիկ կոդով կատարելիս (այդ հատվածների կատարման ընթացքում JVM-ը չպետք է տեղափոխի դրանց հետ կապված կրիտիկական օբյեկտները՝ մրցավազքի պայմաններից խուսափելու համար): Ամրացնելով աղբահանի տեսադաշտից հեռացվում են կարևոր առարկաները, որոնք կարող են շարունակել մաքրել չամրացված տարածքները։
- Ավելացվել է նախնական գործառույթ, որը թույլ է տալիս կոնստրուկտորներին նշել արտահայտություններ՝ super(…) ֆունկցիան կանչելուց առաջ, որն օգտագործվում է ծնող դասի կոնստրուկտորը ածանցյալ դասի կոնստրուկտորից հստակորեն կանչելու համար, քանի դեռ այդ արտահայտությունները չեն վերաբերում կոնստրուկտորի կողմից ստեղծված օրինակին։ դաս Արտաքին { void hello() { System.out.println("Բարև");}} } դաս Ներքին { Ներքին() { բարև(); գեր(); } } }
- FFM (Foreign Function & Memory) API-ը կայունացվել է, ինչը թույլ է տալիս Java ծրագրերին փոխազդել արտաքին կոդի և տվյալների հետ՝ կանչելով ֆունկցիաներ արտաքին գրադարաններից և մուտք գործելով JVM-ից դուրս գտնվող հիշողությանը՝ առանց դիմելու JNI (Java Native Interface)-ի օգտագործմանը։
- Անանուն փոփոխականների և նախշերի համապատասխանեցման աջակցությունը միացված է. չօգտագործված, բայց պարտադիր փոփոխականների և նախշերի փոխարեն այժմ կարող եք նշել «_» նշանը։ // was String pageName = switch (էջ) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “Խնդրի #” + issueNumber; … }; // հիմա կարող եք String pageName = switch (էջ) { case GitHubIssuePage(_, _, _, int issueNumber) -> “Խնդրի #” + issueNumber; };
- Առաջարկվում է Class-File API-ի նախնական իրականացում՝ Java դասի ֆայլերը վերլուծելու, ստեղծելու և փոխակերպելու համար։ ԴասիՖայլ cf = ԴասիՖայլ.of(); ԴասիՄոդել classModel = cf.parse(բայթեր); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue().startsWith("debug"))) { classBuilder.with(ce); } } });
- Java ծրագիրը հնարավորություն է տալիս գործարկել Java ծրագրեր, որոնք մատակարարվում են բազմաթիվ կոդային ֆայլերի կամ նախապես կոմպիլյացված դասերի գրադարանների տեսքով՝ առանց այդ ֆայլերը առանձին կոմպիլյացիայի ենթարկելու կամ կառուցման համակարգը կարգավորելու։ Նոր գործառույթը հեշտացնում է այն ծրագրերի գործարկումը, որոնցում տարբեր դասերի կոդը բաժանված է առանձին ֆայլերի։ Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Բարև!"); } }
Օրինակ՝ երկու ֆայլերից՝ «Prog.java» և «Helper.java», բաղկացած ծրագիր գործարկելու համար բավական է գործարկել «java Prog.java» հրամանը, որը կկոմպիլացնի Prog դասը, կորոշի Helper դասի հղումը, կփնտրի և կկոմպիլացնի Helper.java ֆայլը և կկանչի main մեթոդը։
- Ավելացվել է տողային ձևանմուշների երկրորդ նախնական իրականացումը, որն իրականացվել է տողային լիտերալների և տեքստային բլոկների հետ միասին։ Տողային ձևանմուշները թույլ են տալիս համատեղել տեքստը հաշվարկված արտահայտությունների և փոփոխականների հետ՝ առանց «+» օպերատորն օգտագործելու։ Արտահայտությունների փոխարինումը կատարվում է \{..} փոխարինումների միջոցով, և կարող են միացվել հատուկ մշակիչներ՝ փոխարինված արժեքների ճշգրտությունը ստուգելու համար։ Օրինակ, SQL մշակիչը ապահովում է, որ SQL կոդում փոխարինված արժեքները վավերացվեն և որպես արդյունք վերադարձնում է java.sql.Statement օբյեկտը, մինչդեռ JSON մշակիչը վերահսկում է JSON փոխարինումների ճշգրտությունը և վերադարձնում JsonNode: Տողային հարցում = "SELECT * FROM Person p WHERE p." + հատկություն + " = '" + արժեք + "'"; // was Հրահանգի հարցում = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // դարձավ
- Ավելացվել է Vector API-ի յոթերորդ նախադիտման իրականացումը, որը տրամադրում է վեկտորային հաշվարկների ֆունկցիաներ, որոնք կատարվում են x86_64 և AArch64 պրոցեսորների վեկտորային հրահանգների միջոցով և թույլ են տալիս միաժամանակ կիրառել գործողություններ բազմաթիվ արժեքների վրա (SIMD): Ի տարբերություն HotSpot JIT կոմպիլյատորի սկալյար գործողությունների ավտոմատ վեկտորիզացիայի, նոր API-ն հնարավորություն է տալիս հստակորեն կառավարել վեկտորիզացիան զուգահեռ տվյալների մշակման համար։
- Ավելացվել է ընդլայնված Stream API-ի նախնական իրականացում, որը աջակցում է միջանկյալ գործողությունների սահմանմանը, որը կարող է օգտակար լինել այն դեպքերում, երբ առկա ներկառուցված միջանկյալ գործողությունները բավարար չեն ցանկալի տվյալների փոխակերպման համար։ Հատուկ մշակիչները կցվում են նոր միջանկյալ գործողության՝ Stream::gather(Gatherer)-ի միջոցով, որը մշակում է հոսքի տարրերը՝ դրանց վրա կիրառելով օգտատիրոջ կողմից սահմանված մշակիչ։ jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- Փորձարկման համար առաջարկվում է կառուցվածքային զուգահեռության API-ի երկրորդ տարբերակը, որը պարզեցնում է բազմաթելային ծրագրերի մշակումը՝ տարբեր թելերում աշխատող բազմաթիվ առաջադրանքները որպես մեկ միավոր մշակելով։
- Ավելացվել է «main» մեթոդի անուղղակիորեն հայտարարված դասերի և անանուն օրինակների երկրորդ նախնական իրականացումը, որը կարող է գործել առանց public/static հայտարարագրերի, արգումենտների զանգվածի փոխանցման և դասի հայտարարագրման հետ կապված այլ էնտիտների։ // public class HelloWorld { public static void main(String[] args) { System.out.println("Բարև աշխարհ!"); } } // հիմա կարող եք void main() { System.out.println(«Բարև, Աշխարհ!»); }
- Ավելացվել է Scoped Values-ի երկրորդ նախնական իրականացումը, որը թույլ է տալիս անփոփոխ տվյալներ փոխանակել թելերի միջև և տվյալներ արդյունավետորեն փոխանակել դուստր թելերի միջև (արժեքները ժառանգվում են): Սկոպեդ արժեքները զարգանում են՝ փոխարինելու թել-տեղական փոփոխականների մեխանիզմը և ավելի արդյունավետ են դառնում շատ մեծ թվով վիրտուալ թելերի (հազարավոր և միլիոնավոր թելերի) օգտագործման ժամանակ։ Scoped Values և thread-local փոփոխականների հիմնական տարբերությունն այն է, որ առաջինները գրվում են մեկ անգամ, չեն կարող փոփոխվել հետագայում և մնում են հասանելի միայն thread-ի կատարման ընթացքում։
- Parallel garbage collector-ը բարելավել է իր արդյունավետությունը օբյեկտների մեծ զանգվածների հետ աշխատելիս։ Օպտիմալացումը թույլ տվեց մեզ որոշ փորձարկումներում օբյեկտների մեծ զանգվածներով 20%-ով կրճատել օբյեկտի որոնումը սկսելուց առաջ առաջացող ուշացումը։
Բացի այդ, կարող ենք նշել JavaFX 22 գրաֆիկական ինտերֆեյսով հավելվածներ ստեղծելու հարթակի թարմացման հրապարակումը։
Source: opennet.ru
