A Java 19 újdonságai

Tartalomjegyzék
Sorozatunk előző része a Java 18-ról szól. Az előző részt itt találod meg. A Java 19 számos újítást hozott a népszerű programnyelv világába. Ebben a cikkünkben a Java 19 legfontosabb újdonságai közül szemezgetünk.
Érdekelnek az új technológiák?
Azért vagyunk, hogy segítsünk.
A Java 19-ben lévő feature-ök többsége preview vagy ún. incubator, azaz előzetes funkció, amelyek csak később kerülnek be a végleges Java-ba, ha egyáltalán bekerülnek. Általában nem ez a szokványos – a korábbi Java verziók esetében az volt látható, hogy a kísérleti feature-ök mellett rengeteg végleges funkcióval is megajándékoztak minket a fejlesztők. Ettől még ezek is roppant érdekes dolgok, és bízunk benne, hogy a többségük minél hamarabb bekerül a production verzióba is. Ha egy cikkben szeretnéd látni minden egyes Java verzió újdonságait a Java 4-től kezdve, ide kattintva tudod megnézni.
Virtual threads (preview)
A szálkezeléssel népszerű Youtube-sorozatunkban is foglalkoztunk ettől a résztől kezdődően. Beágyazom videó formájában is az előző mondatban hivatkozott szálkezeléses videók első felvételét:
Mindenképp javaslom videósorozatunkat ahhoz, hogy megértsd a szálkezeléssel kapcsolatos legfontosabb alapvetéseket. Természetesen junior kurzusunkban is kiemelkedő jelentőséget tulajdonítunk annak, hogy elsajátítsátok a szálkezelést, hiszen a programozói életben gyakran kerülnek elő olyan helyzetek, amikor párhuzamosan több utasítást szeretnénk végrehajtani.
Mik azok a virtuális szálak?
A virtuális szálak, azaz virtual threads, a Project Loom részeként lettek kifejlesztve, és nem sokkal később, a Java 19-ben be is kerültek a Java-ba. A virtuális szálak gyakorlatilag olyan szálak, amelyeket maga a futtatási környezet, azaz a runtime environment, nem pedig az OS (operációs rendszer) kezel, valósít meg. A virtuális szálak sokkal gyorsabb és hatékonyabb módjai a szálkezelésnek bizonyos helyzetekben, hiszen közvetlenül a futtatási környezet hozza létre és szünteti meg őket, nem pedig az operációs rendszer. Ha nem teljesen érthető, mit értünk Java futtatási környezet alatt, mindenképp javaslom, hogy olvasd el ezt a cikkünket, ahol részletesen leírtam egy cikket pont erről a témáról.
Programozóvá válnál?
Azért vagyunk, hogy segítsünk.
Structured concurrency (preview)
A structured concurrency – vagy magyarra fordítva strukturált párhuzamosság – kiegészíti a virtuális szálakat, és arra szolgál, hogy a több szálon futó kódot átláthatóbbá és kezelhetőbbé tegye. Ilyeténképpen ez az újdonság is csupán preview funkcionalitásban érhető el. Ezzel a megközelítéssel a szálak életciklusai jobban követhetők, ami megkönnyíti a hibakezelést és a kód karbantartását.
Az új StructuredTaskScope
API használata lehetővé teszi a különböző szálak közötti logikai kapcsolatokat, és segít abban, hogy a szálak közötti kommunikáció könnyen követhető legyen.
Példa a strukturált párhuzamosság használatára:
try (var scope = new StructuredTaskScope.ShutdownOnFailure())
{
Future<String> result1 = scope.fork(() -> "Feladat 1 eredménye");
Future<String> result2 = scope.fork(() -> "Feladat 2 eredménye");
scope.join(); // Várakozás mindkét feladat befejezésére
System.out.println(result1.resultNow());
System.out.println(result2.resultNow());
}
Ha szorgalmasan olvastad korábbi Java verziókról szóló cikkeinket, akkor felteszek néhány ellenőrző kérdést:
- Mi az a try-with-resources?
- A Java melyik verziójától elérhető a try-with-resources?
- Mi a különbség a try-with-resources és a hagyományos try blokk között?
- Hogy írnád át ezt a blokkot hagyományos try-ra? Mi az, amit így elvesztene a funkcionalitásából a kód?
Record patterns (preview)
Korábbi cikkeinkben, például ebben, beszéltünk már a pattern matching-ről. Ezt a pattern matching-et a rekordokra is kiterjesztették egy előzetes feature-ben. Nézzünk erre egy példát. Tegyünk fel, hogy van egy pofonegyszerű, embert reprezentáló rekordunk:
public record Person(String name, int age) {
}
Ebben az esetben például a következő módon tudunk pattern matching-et megvalósítani a Java előzetes feature-einek bekapcsolása után:
Object object = new Person("Hallgató Ákos", 30);
if (object instanceof Person(String name, int age)) {
System.out.println("object is a Person");
System.out.println("name: " + name);
System.out.println("age: " + age);
} else {
System.out.println("object is not a Person");
}
Emellett a hivatalos dokumentációból az is kiderül, hogy egyrészt már rengeteg bonyolultabb dolog működik a pattern matching esetében, ilyen például a generikus rekordok esete. A másik fontos dolog a végén lévő ötletjegyzék, ahol leírták, hogy milyen arányba lehetne még kiterjeszteni a már meglévő működést:
- Rekord array pattern-ök
- Rekord varargs pattern-ök
- Generikus pattern-öknél a típusargumentum-interferencia támogatása
- Do-not-care pattern-ök, ahol a rekordunk bizonyos változói irrelevánsak a match szempontjából
- Ehhez hasonló minták kiterjesztése tetszőleges osztályokra, nem csak rekordokra. Megjegyzem, hogy ahogy már vettük korábban, maguk a switch expression-ök léteznek, de az osztályok destrukturálása, amit a fenti Person-ös példámban mutattam, ilyen módon nem létezik.
Egy lelkes és szakmája iránt igényes programozónak eszméletlenül fontos, hogy nyitott legyen az újdonságokra, kövesse azokat. Erre bátorítjuk a kurzusainkon résztvevőket is. Köszönöm, hogy velem tartottál!
Sorozatunk következő verzióját itt találod.
Szerző: Nagy Csongor