A szöveges blokk és a switch kifejezések lesznek talán a programozók mindennapjait közvetlenül befolyásoló új nyelvi eszköz a jövőben. De mik is ezek pontosan és hogy lehet ezeket használni? Milyen más újításokat vezet be a Java 13? Olvasd el lentebb!
Tartalom
- Mikor lesz elérhető a Java 13?
- Szöveges blokk – Text blocks (preview)
- Switch kifejezések – Switch expressions (preview)
- ZGC: Nem használt memória felszabadítása az operációs rendszer számára
- Régi Socket API újraimplementálása
- Dinamikus CDS archívumok
- Összefoglalás
Mikor lesz elérhető a Java 13?
A végleges verzió várhatóan 2019. szeptember 17-én fog megjelenni. Néhány új nyelvi elem csak kísérleti jelleggel kerül bele a Java-ba, ezeket ha ki szeretnéd próbálni, akkor egy külön kapcsolóval kell ellátni a javac és java parancsokat. Részletesebben lásd lentebb!
De nem kell eddig várnod, hogy kísérletezz ezekkel az új feature-ökkel, hisz a GA (general availability) előtt is letölthetők a tesztelhető verziók.
Szöveges blokkok – Text blocks (preview)
A Java 13-mal érkezik ez a új feature, de egyelőre csak preview formában, vagyis még csak kísérleti jelleggel. Ha ki szeretnéd próbálni, akkor a programod fordításakor és indításakor a JVM-nek át kell adni a
--enable-preview
kapcsolót. Ennek hiányában a fordító bután fog rád nézni a forráskódod láttán.
Ha nem parancssorból futtatod a programod, akkor a kedvenc IDE-d legújabb verziójában a beállításoknál kell ezt engedélyezned. Eclipse esetén Window -> Preferences -> Java -> Compiler -> Enable preview features

Már a Java 12-be is terveztek egy raw string nevű feature-t, ami végül nem került bele, a kiadás előtti utolsó pillanatban kiszedték belőle. Ezek a nyers string-ek is hasonló ötlet alapján születtek, de végül a Java fejlesztő mérnökei úgy gondolták, hogy egy másik megközelítés lenne a megfelelőbb hosszú távon. A raw string, ahogy a nevük is utal rá, nyers szöveges literálok lettek volna, vagyis a kezdő és bezáró idézőjelei között nem értelmezte volna a JVM a speciális karaktereket.
Újragondolták ezt a megközelítést és a raw stringek helyett a text blokkok bevezetése mellett döntöttek a fejlesztők.
Miért jó a szöveges blokk?
A probléma, amit a szöveges blokk hivatott megoldani onnan fakad, hogy Java forráskódban sokszor kell más programozási nyelvek kódjait összeállítanunk. Gondolok itt például az adatbázis kezelésnél használatos SQL-re, a webes alkalmazásoknál a front-endnek küldendő JSON fájlokra, de akár XML-eknél és HTML-eknél is gondokba ütközünk. A problémát az okozza, hogy más programozási nyelv is használ olyan írásjeleket, speciális karaktereket, amik a Java számára is jelentőséggel bírnak. Például az idézőjel (“) a Java-ban a String literálok elejét és végét jelzi. Ha a String literál tartalmaz egy idézőjelet valahol a tartalmán belül, akkor ezt escape-elni kell egy backslash (\) szimbólummal, vagyis \” -t kell írnunk a kódunkba. Amikor HTML kódot Java-ban String-ként kezelünk, akkor olyan gyakran kell élnünk ezzel az escape-eléssel, hogy teljesen olvashatatlanná teszi a kódot. Gondot okoznak az új sor karakterek is, mert a Java-ban egy sima String literált egy sorban kell definiálni. Az új sor karaktert speciális \n escape szekvenciával kell jelölnünk, hogy belekerüljön a String literálunkba.
Hogy néz ki a szöveges blokk?
3 idézőjellel kell kezdődnie a szöveges blokknak és ezzel is kell záródnia.
String text = """ Az erős fókuszálású szinkrotronokban rengeteg mágnes található, hogy fókuszálják a részecskenyalábot és meggörbítsék a pályáját. """
Fontos, hogy egy előfeldolgozáson esik át az ilyen módon megadott String literál, az első karaktere ennek a String-nek a nagy A betű lesz a mondat elején, holott egy csomó szóköz (whitespace) karakter megelőzi azt. Ezek a kezdeti whitespace-ek eldobásra kerülnek, egyfajta automatikus trim-elés történik. Ugyanez a helyzet a String literál végén is, az ottani szóközök is levágásra kerülnek. A mondat végén a pont után lesz egy sortörés. Ha ezt nem szeretnénk, akkor így kell megadnunk az előző szöveg blokkot:
String text = """ Az erős fókuszálású szinkrotronokban rengeteg mágnes található, hogy fókuszálják a részecskenyalábot és meggörbítsék a pályáját."""
Switch kifejezések – Switch expressions (preview)
A switch kifejezések már a Java 12-ben is kipróbálhatók voltak, erről írtam is egy blog posztot annak idején, aminek az átolvasását jó szívvel ajánlom továbbra is, hisz ez az egyik legnagyobb változás a Java nyelv eszközkészletét tekintve mostanság és a közeljövőben, ami a mindennapi programozás során előkerül és így használható. Az blog posztban leírtakhoz képest egy apró változás történt pusztán azóta. Amikor expression-ként, vagyis kifejezésként használjuk a switch-et, akkor a Java 12-s preview-ban még a break utasítást használhattuk egy értékkel együtt, hogy az adott switch kifejezés az adott értékkel térjen vissza mint helyettesítési értékkel, azonban a Java készítői úgy gondolták, hogy jobb lenne egy másik kulcsszót használni. Így ebben az esetben a break helyett a yield szót tudjuk majd használni. Persze a Java 13-ban is csak preview jelleggel került be ez az új feature, ezért ez még tovább változhat a következő verziókban, amíg nem véglegesítik.
String nameOfDay = "szombat"; int dayOfWeek = switch (nameOfDay) { case "hétfő": yield 1; case "kedd": yield 2; case "szerda": yield 3; case "csütörtök": yield 4; case "péntek": yield 5; case "szombat": yield 6; case "vasárnap": yield 7; default: System.out.println("Ismeretlen nap."); yield 0; }; System.out.println("Ez a(z) " + dayOfWeek + ". napja a hétnek.");
A yield egy új kulcsszó lesz a Java 13-tól kezdve.
ZGC: Nem használt memória felszabadítása az operációs rendszer számára
A Java 11 egyik kísérleti jelleggel bevezetett új szemétgyűjtője volt a Z Garbage Collector, vagy röviden ZGC. A több terabájtos heap-ek esetén is nagyon rövid megállási időket ígér. Az egyik hátránya az volt, hogy ha egy program sok memóriát igényelt a futása során, akkor a megnövekedett heap használat még ha az idővel meg is szűnt, akkor se tudta visszaadni a most már újra felszabadult memóriaterületet az operációs rendszernek. A Java 13-ban ezt a funkciót implementálták a ZGC esetén is.
Java 9-től kezdve az alapértelmezett garbage collector továbbra is a G1GC, vagyis a Garbage First Garbage Collector.
Régi Socket API újraimplementálása
A hálózati kommunikációt lehetővé tevő java.net csomagban található Socket és ServerSocket osztályok implementációi még a JDK 1.0-ban történtek, vagyis 1996-ban. Ezek feje felett igencsak eljárt már az idő, és több problémát is okoznak. Az eredeti implementációk régi Java és C kód keveréke, amit nehéz karbantartani és nehéz bennük hibát keresni.
Angolul itt tudsz erről többet olvasni, ha kíváncsi vagy a részletekre: JEP 353
Dinamikus CDS archívumok
A CDS, vagyis a Class Data Sharing, egy olyan már most is létező lehetősége a JVM-nek, ami az indítási idejét tudja felgyorsítani a programunknak, illetve memóriahasználat szempontjából is hasznos tud lenni. Egy alkalmazás osztályait lehet archiválni annak leállásakor, és így a futása alatt a class loader-ek által szerzett információt össze lehet gyűjteni egy archívumba, aminek a segítségével a következő indítás teljesítménye javítható. A Java 13-as újítás e téren segít ezen információk kigyűjtésében és nem lesz többé szükséges próbafuttatások végzése, mint korábban.
Összefoglalás
A Java 13-mal ez az 5 új feature kerül bele a nyelvbe, de ebből 2 még csak kísérleti jellegű, preview feature. Ezeket csak akkor tudod kipróbálni, ha egy külön kapcsolóval bekapcsolod a javac és a java programoknál, vagy az IDE-dben. A switch kifejezés a Java 12 verziója óta keveset változott, de még mindig ez az egyik olyan új lehetőség, amit a legtöbbet tudjuk majd a napi programozási feladataink során használni. A másik nagy újítás a text block, vagyis a szöveges blokk, ami egy igen rég óta várt funkció. A többsoros és speciális karaktereket tartalmazó String literálok beágyazása a forráskódunkba olvasható módon fantasztikus újítás. Mindezeket kipróbálhatod a végleges verzió várható szeptemberi megjelenése előtt.