Preskočiť na obsah

Novinky v Jave 17

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;
    }
}

JEP 306

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.

JEP 356

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.

JEP 382

MacOS/AArch64 Port

Port JDK pre AArch64 v macOS platforme.

JEP 391

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.

JEP 398

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ť

JEP 403

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 406

JEP 407: Remove RMI Activation

RMI Activation balíček java.rmi.activation bol odstránený.

JEP 407

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.

JEP 409

Remove the Experimental AOT and JIT Compiler

Odstránený experimentálny  Ahead-of-time kompilátor (jaotc) a Java-based JIT kompilátor.

JEP 410

Deprecate the Security Manager for Removal

Security manager bol označené ako deprecated for removal.

JEP 411

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.

JEP 412

Vector API (Second Incubator)

JEP 414

Context-Specific Deserialization Filters

JEP 415

Značky: