V tomto článku se podíváme na změny, které přinesla Java 18.
Kódování textů
V první řadě se změnilo základní nastavení kódování. Pokud jsi dosud pracoval na Windowsu a vytvářel si soubor například přes FileWriter tak kódování textu bylo uloženo ve formátu Windows-1252. Pokud si vytvářel soubor na Linuxu nebo Macu tak data byla uložena ve formátu UTF-8. Nyní i když jsi na Windowsu, tak základní kódování je nastaveno na UTF-8.
Jednoduchý web server
Java 18 představila příkaz jwebserver v příkazovém řádku. Tento příkaz spustí minimalistický webový server pro snadné testování. Tento server lze vytvořit také programově pomocí metody SimpleFileServer.createFileServer.
Pattern matching ve switch
Ve verzi 18 je stále v preview fázi. Tato funkce umožňuje použít switch flexibilněji, zejména s prací s typy v době příkazu.
Zde jsou další příklady pro ilustraci:
Switch nad, který pracuje s různými typy objektů:
switch (obj) {
case Integer i -> System.out.println("Integer: " + i);
case String s -> System.out.println("String: " + s);
case null -> System.out.println("It's null!");
default -> System.out.println("Unknown type");
}
Switch, který pracuje s objekty a s takzvanými guards, což jsou další logické požadavky:
switch (obj) {
case String s && s.length() > 5 -> System.out.println("Long string: " + s);
case String s -> System.out.println("Short string: " + s);
case Integer i && i > 10 -> System.out.println("Large integer: " + i);
default -> System.out.println("Other");
}
V tomto příkladu řádek, který sleduje, zda je délka stringu větší než 5 dominuje nad druhým časem, který řeší jen zda je s String.
Pokud bych je vyměnil
switch (obj) {
case String s -> System.out.println("Short string: " + s);
case String s && s.length() > 5 -> System.out.println("Long string: " + s);
case Integer i && i > 10 -> System.out.println("Large integer: " + i);
default -> System.out.println("Other");
}
tak druhý řádek by byl chybový a hláška zní:
Label je dominated by a preceding case label 'String s'
Switch, který pracuje se sealed třídami:
sealed interface Shape permits Circle, Rectangle {}
final class Circle implements Shape { }
final class Rectangle implements Shape { }
A switch, který může pracovat se specifickými subtypy třídy Shape:
Shape shape = new Circle();
switch (shape) {
case Circle c -> System.out.println("It's a circle");
case Rectangle r -> System.out.println("It's a rectangle");
}