A Java 17 újdonságai

Sorozatunk előző részében a Java 16 újdonságaival foglalkoztunk. Elérkeztünk Java sorozatunk következő részéhez, amelyben a Java 17 nyelvi újdonságait vesszük szemügyre. A Java 17 feature-eit / újdonságait mindenképp érdemes tanulmányozni, hiszen a Java 17 LTS verzió – éppen ezért ez sokkal nagyobb figyelmet kap a közösség és az interjúztatók részéről is, mint egy nem LTS Java verzió.

Ha nincs sok időd, és egy cikkben szeretnéd látni minden egyes Java verzió újdonságait a Java 4-től kezdve, ide kattintva tudod megnézni.

Sealed class-ok

Hurrá! A Java 15-ben előzetesen bemutatott sealed class-ok véglegesen a nyelv részévé váltak! Ha szeretnéd megérteni, hogy mik azok a sealed class-ok, olvasd el a Java 15-ről korábban írt összefoglalónkat.

Ha nincs időd elolvasni a korábbi, részletes verziót, akkor röviden a sealed class-ok lehetővé teszik, hogy meghatározzuk, mely osztályok örökölhetnek egy adott osztályt vagy valósíthatnak meg egy interfészt. Ez javítja a kód fenntarthatóságát, mivel csökkentjük a lehetséges konkrét megvalósítások számát, és kiszámíthatóbbá tesszük az osztályhierarchiát.

Pattern matching switch-csel (előzetes)

Ez a funkció kibővíti a switch utasítást a mintaillesztéssel. Ez tisztább, olvashatóbb kódot tesz lehetővé, különösen akkor, ha különböző típusú objektumokat kell kezelni a switch kifejezésben. A mintaillesztés switch-hez még előzetes verzióban van, később fogják véglegesíteni. Itt egy nagyon egyszerű metódus, ami bemutatja ennek az új szintaxisnak a használatát:

static void switchExpressionsExample(Object obj) {
  switch (obj) {
    case String s -> System.out.println("Szöveg: " + s);
    case Integer i -> System.out.println("Egész szám: " + i);
    default -> System.out.println("Ismeretlen típus");
  }
}

Korábban ugyanezt a logikát csak jóval körülményesebben, if-else blokkokkal és rengeteg cast-olással tudtuk volna megírni valahogy így:

public static void typeCheckWithoutSwitchExpressions {
    Object obj = "Ez egy szöveg";
    if (obj instanceof String) {
        String s = (String) obj;
        System.out.println("Szöveg: " + s);
    } else if (obj instanceof Integer) {
        Integer i = (Integer) obj;
        System.out.println("Egész szám: " + i);
    } else {
        System.out.println("Ismeretlen típus");
    }
}

Tanulnál erről bővebben?

Azért vagyunk, hogy segítsünk.

Könnyű belátni, hogy az új, switch-es pattern matching módszer sokkal olvashatóbb, érthetőbb, könnyebben bővíthető és rugalmasabb megoldást jelent, éppen ezért ha Java 17+-os projekten dolgozol, mindenképp javasoljuk ennek a használatát.

UTF-8 alapértelmezett karakterkészletként

A Java 17-ben az UTF-8 lett az alapértelmezett karakterkódolás a Java API-k számára, ami javítja a különböző platformok közötti konzisztenciát, mivel az UTF-8 széles körben használt az internalization (röviden: i18n) során.

Továbbfejlesztett pszeudo-random generátorok

A Java 17-ben bevezetésre került a továbbfejlesztett pszeudo-véletlenszám-generátorok (PRNG-k) rendszere a JEP 356 részeként. Ez az újítás nagyobb rugalmasságot, jobb minőségű véletlenszám-generálást és szélesebb algoritmusválasztékot kínál a Java véletlenszám-generálási keretrendszerében.

Új interfész: RandomGenerator

Ennek a fejlesztésnek a központi eleme a RandomGenerator nevű új interfész bevezetése. Ez az interfész egységesíti a különböző véletlenszám-generátor (RNG) implementációkat egy közös API alatt, így könnyebbé téve a használatukat és testreszabásukat. Az interfész főbb metódusai:

  • int nextInt()
  • long nextLong()
  • double nextDouble()
  • void nextBytes(byte[] bytes)

A RandomGenerator interfészt minden standard RNG megvalósítja, beleértve a java.util.Random-ot, a ThreadLocalRandom-ot, és a Java 17-ben bevezetett új generátorokat is.

Új RNG algoritmusok

A Java 17 több új algoritmust vezetett be a véletlenszám-generáláshoz (angolul a véletlenszám-generátorokat random number generator-öknek, azaz RNG-knek hívjuk), amelyek szintén implementálják a RandomGenerator interfészt. Ezek az új algoritmusok kifejezetten teljesítményre, véletlenszám-minőségre és kriptográfiai erősségre lettek optimalizálva:

  • L64X128MixRandom: Egy nagy teljesítményű generátor, amely az „LXM” családon alapul, kombinálva lineáris kongruens generátorokat (LCG) és xorshift technikákat.
  • L64X256MixRandom: Az előző algoritmus egy változata nagyobb állapotmérettel.
  • L64X1024MixRandom: Egy változat, amely még nagyobb állapotméretet kínál.
  • L128X128MixRandom: Egy másik LXM variáns eltérő állapotmérettel.
  • L128X256MixRandom: Hasonló a L128X128MixRandom-hoz, de nagyobb véletlenszerűséget és állapotméretet biztosít.

Ezek az algoritmusok jobb minőségű véletlenszerűséget és jobb teljesítményt biztosítanak a hagyományos java.util.Random-hoz képest.

Érdekel az RNG?

Azért vagyunk, hogy segítsünk.

Stream support a véletlen számokhoz

Az új generátorok támogatják a véletlen számok streamként történő létrehozását a RandomGenerator interfész segítségével. Például készíthetünk IntStream-et, DoubleStream-et vagy LongStream-et a funkcionális programozásban való felhasználáshoz.

Összefoglalva tehát a Java 17 rengeteg újdonsággal könnyíti meg a fejlesztők életét, és eszméletlenül nagy segítséget tud nyújtani abban, hogy tisztább, hatékonyabb és olvashatóbb kódot írjunk.

Ingyenes, 200 részes YouTube-sorozatunk sokat segít neked a programozás alapjainak elsajátításában, tanfolyamainkon pedig mindig odafigyelünk arra, hogy figyelemmel kövessük az összes fontos új nyelvi elemet, és piacképes, XXI. századi tudást adjunk a kezedbe.

Köszönjük, hogy velünk tartottál, várunk sorozatunk következő részében!

Szerző: Nagy Csongor