A Java 19 újdonságai

java 19

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