14. septembra 2O21 bola vydaná nová Java 17 s dlhou podporou (LTS). Oracle oznámil, že Java 17 bude podporovaná do roku 2029. V tomto článku si rozoberieme novinky a zmeny, ktoré táto verzia priniesla.
Nejaké príklady je možné nájsť na GitHube.
Restore Always-Strict Floating-Point Semantics
Od verzie Javy 1.2 boli matematické operácie s číslami s pohyblivou rádovou čiarkou platformovo závislé a teda presnosť výsledku takejto operácie sa mohla líšiť podľa použitého hardvéru. Pred Javou 1.2 boli všetky operácie s číslami s pohyblivou rádovou čiarkou striktné ale spôsobovali problémy s prehrievaním na x87 architektúre. Z toho dôvodu bol predvolený spôsob výpočtu zmenený na mierne odlišný. Striktný mód bolo možné zapnúť pomocou kľúčového slova strictfp.
Od kedy Intel a AMD procesory implementovali SSE2 (Streaming SIMD Extensions 2), ktorý podporuje JVM matematické operácie v pohyblivej rádovej čiarke aj bez problémov s prehrievaním, sú problémy architektúry x87 minulosťou a teda mohlo byť obnovené chovanie ako bolo pred Javou 1.2. Kľúčové slovo strictfp je teraz voliteľné.
public strictfp class StrictCalculator {
public double calculate(double value1, double value2) {
return value1 + value2;
}
}
public class BasicCalculator {
public double calculate(double value1, double value2) {
return value1 + value2;
}
}
Enhanced Pseudo-Random Number Generators
Vylepšenie v generátoroch pseudonáhodných čísel prinieslo hlavne nové rozhranie RandomGenerator a triedu RandomGeneratorFactory s metódou of, čo výrazne zjednodušilo ich používanie a vytváranie nových generátorov. Vďaka spoločnému rozhraniu sú všetky implementácie algoritmov vzájomne zameniteľné. Všetky známe generátory (Random, SplittableRandom…) implementujú rozhranie RandomGenerator.
void printRandomDouble() {
RandomGeneratorFactory<RandomGenerator> factory = RandomGeneratorFactory.of("Random");
RandomGenerator generator = factory.create();
System.out.println(generator.nextDouble());
}
Zoznam dostupných algoritmov je možné nájsť tu.
New macOS Rendering Pipeline
Toto je len interná zmena a týka sa úpravy Java 2D renderovacej pipelajny, ktorú používa interne napríklad Swing, pre macOS po tom čo Apple prešiel z OpenGL knižnice na Metal framework. Nebolo pridané alebo zmenené žiadne iné API.
MacOS/AArch64 Port
Port JDK pre AArch64 v macOS platforme.
Deprecate the Applet API for Removal
Applet API bolo označené ako deprecated v Jave 9 a teraz bolo označené ako deprecated for removal. Táto zmena je celkom bezvýznamná, pretože väčšina prehliadačov už odstránila podporu pre Java pluginy.
Strongly Encapsulate JDK Internals
Prístup k internému JDK API bol zablokovaný. Pomocou prepínača --illegal-access je možné interné API sprístupniť
Pattern Matching for switch (Preview)
Java 17 pridáva podporu pre Pattern matching pre switch expression a statement. Novinka je vo verzii preview a je použitie je možné s prepínačom --enable-preview
Pattern matching je mechanizmus, ktorý umožňuje porovnať alebo skontrolovať danú hodnotu voči viacerým vzorom. Prispieva k lepšej čitateľnosti kódu a zvyšuje expresívnosť jazyka.
If-Else
static String formatter(Object o) {
String formatted = "unknown";
if (o instanceof Integer i) {
formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
formatted = String.format("double %f", d);
} else if (o instanceof String s) {
formatted = String.format("String %s", s);
}
return formatted;
}
static String formatterPatternSwitch(Object o) {
return switch (o) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> o.toString();
};
}
Refine
public String checkShape(Shape shape) {
return switch (shape) {
case Triangle t && (t.getNumberOfSides() != 3) -> "This is a weird triangle";
case Triangle t -> "This is a normal triangle";
case Circle c && (c.getNumberOfSides() != 0) -> "This is a weird circle";
default -> "Just a normal shape";
};
}
Null check
static void testString(String s) {
switch (s) {
case null -> System.out.println("Unknown!");
case "Java 11", "Java 17" -> System.out.println("LTS");
default -> System.out.println("Ok");
}
}
JEP 407: Remove RMI Activation
RMI Activation balíček java.rmi.activation bol odstránený.
Sealed Classes
Sealed triedy umožňujú explicitne vymenovať zoznam tried, ktoré môžu dediť z danej triedy alebo implementovať dané rozhranie.
public sealed interface Response permits No, Yes {
}
public final class Yes implements Response {
}
public final class No implements Response {
}
Sealed triedy boli vydané už Jave 15 a Jave 16 ako preview. V Jave 17 bola vydaná finálna verzia.
Remove the Experimental AOT and JIT Compiler
Odstránený experimentálny Ahead-of-time kompilátor (jaotc) a Java-based JIT kompilátor.
Deprecate the Security Manager for Removal
Security manager bol označené ako deprecated for removal.
Foreign Function & Memory API (Incubator)
Cieľom tejto zmeny je nahradiť JNI API a zjednodušiť volanie kódu a prístup k pamäti mimo JVM.