Najnovšia verzia Java je Java 20 alebo JDK 20 vydaná 21. marca 2023. JDK 17 je najnovšia LTS platformy Java SE. Postupne si budeme predstavovať zmeny v Jave od verzie 15 a v tomto článku si predstavíme hlavné programátorské zmeny vo verzii 15.
Text Blocks
O tejto funkcionalite sme už rozprávali. Teraz je však táto funkcia zaradená ako štandard a nie ako preview funkcionalita. Napriek tomu si to znovu vysvetlíme, ak si napríklad túto časť preskočil v minulosti hlavne kvôli preview statusu.
Funkcia Text Blocks umožňuje zápis viacriadkových reťazcov (texty) jednoducho. Týmto spôsobom je možné zapisovať ľahšie čitateľné reťazce, ktoré obsahujú viac riadkov alebo formátovaný text.
Text Blocks začínajú a končia trojitými úvodzovkami ("""") a môžu obsahovať text, ktorý je rozdelený do viacerých riadkov bez potreby zadávať znak nového riadku /n. Java tu zohľadňuje nové riadky a na pozadí automaticky odstraňuje nadbytočné biele znaky (medzery, tabulátory) na začiatku riadkov.
Ako sa správa to automatické odstraňovanie? Pozrime sa na príklad:
Jednoduchý kúsok HTML. Ak si všimneš, tak tag <html> je od pravej ľavej strany odsadený. Je tam viacero bielych znakov. Keď tento text budeš používať ďalej, tak tieto biele znaky budú odstránené.
Na ďalších príkladoch si všimni ako sa pohybuje zelená zvislá čiara. Podľa nej zistíš ako sa odstraňujú biele nadbytočné znaky.
Nakoniec si daj pozor, aby tvoj text nezačínal na riadku prvých trojitých úvodzoviek, lebo to by bol chybný zápis. Za prvými trojitými úvodzovkami musí byť nový riadok. Ďalšie príklady:
Java Records boli uvedené už v Jave 14 ako skorý preview. V Jave 15 boli nejaké zmeny a vylepšienia. Poďme si povedať, čo sú tie Java Records. V Jave 15 je táto funkcionalita stále v preview móde.
Records je nový druh tried, ktoré slúžia na zjednodušenie práce s dátovými triedami. To sú triedy, ktoré majú slúžiť ako jednoduchý nositeľ informácie. Tieto triedy automaticky generujú konštruktory, metódy equals, hashCode a toString bez nášho zašpecifikovania.
Príklady
Vytvorenie record:
public record User(int id, String name, int age) {}
Použitie:
User user = new User(1, "Jaro", 35);System.out.println(user.name()); // Výstup: Jaro
Je to rozdiel oproti klasickej definícii triedy, kde si musel zašpecifikovať konštruktor a get metódy. Je to kratšie a prehľadnejšie.
Ďalšie príklady:
record Employee(String name, int id) {}
Employee employee = new Employee("Janka", 534);
String name = employee.name();
int id = employee.id();
Máme možnosť zadefinovať vlastný konštruktor. Napríklad ak chceme urobiť nejaký test nad vstupnými dátami:
record Adult(int age, String Name) {
public Adult {
if (age < 18) {
throw new IllegalArgumentException("Must be adult.");
}
}
}
Adult validAdult = new Adult(35, "Jaro");
Adult invalidRange = new Adult(10, "Fero"); // exception
Môžeme pridávať metódy:
record Circle(Point center, double radius) {
double area() {
return Math.PI * radius * radius;
}
}
Circle circle = new Circle(new Point(0, 0), 5);
double area= circle.area();
Pattern Matching for instanceof je funkcia, ktorá bola zavedená v Jave 15 ako druhá fáza návrhu (preview feature). Táto funkcia zjednodušuje testovanie typu objektu a získavanie hodnoty z objektu.
Pattern Matching
Pattern Matching je znovu predstavený v statuse preview. Umožňuje kombinovať overenie typu a pretypovanie do jedného kroku, čo zlepšuje čitateľnosť a zjednodušuje kód.
Všimni si, že v podmienke sme predstavili premennú s typu String. Táto sa nazýva binding variable.
Object obj = "Hello, World!";
if (obj instanceof String) {
String text = (String) s;
System.out.println("Length: " + s.length());
} else {
System.out.println("Not a string");
}
Ďalšie príklady:
Object data = List.of("one", "two", "three");
if (data instanceof String s) {
System.out.println("Length: " + s.length());
} else if (data instanceof List<?> list) {
System.out.println("Size: " + list.size());
}
Object obj = 3.14;
if (obj instanceof Integer i || obj instanceof Double d) {
System.out.println("Number: " + obj);
} else {
System.out.println("Not a number");
}
Sealed Classes
Sealed Classes je v Jave 15 ako preview. Sealed Classes umožňujú obmedziť rozsah dedenia tried. Týmto spôsobom môžeš kontrolovať, ktoré triedy môžu dediť od tejto triedy. Sealed Classes sú často používané v kombinácii s pattern matchingom.
Majme sealed triedu:
sealed class Shape permits Circle{}
Trieda, ktorej povoľuje dedenie musí byť final.
final class Circle extends Shape {
...} final class Rectangle extends Shape { ...}
Teraz sme povedali, že od triedy Shape môže dediť len Circle. Pri iných triedach, ktoré by sa pokúsili dediť od triedy Shape bude chyba is not allowed in the sealed hierarchy.
Tento princíp vieme využiť napríklad takto:
double calculateArea(Shape shape) {
return switch (shape) {
case Circle c -> Math.PI * c.getRadius() * c.getRadius();
case Rectangle r -> r.getWidth() * r.getHeight();
};
}
Na vstupe máme Shape a vieme, že od neho môže dediť len Circle a Rectangle.
Hidden Classes
Pre bežného používateľa nezaujímavé a pravdepodobne to nikdy nevyužije. V skratke ide o to, že je možné vytvárať triedy zabehu aplikácie a nie sú viditeľné ani použitím reflexie.
🥇 Sme jednotka v online vzdelávaní na Slovensku. Na našom webe nájdeš viac ako 300 rôznych videokurzov z oblastí ako programovanie, tvorba hier, testovanie softwaru, grafika, UX dizajn, online marketing, MS Office a pod. Vyber si kurz, ktorý ťa posunie vpred ⏩