JDK 15

released 2020-11-10

Jochen Bürkle

Java Releases Roadmap

java releases

ORACLE Definitionen zum JDK

Preview

"A preview feature is a new feature whose design, specification, and implementation are complete, but which is not permanent, which means that the feature may exist in a different form or not at all in future JDK releases."

Preview Features müssen per Compiler- bzw. JVM-Runtime Parameter explizit freigeschaltet werden

ORACLE Definitionen zum JDK

Incubator

"Incubator modules are a means of putting non-final APIs and non-final tools in the hands of developers, while the APIs/tools progress towards either finalization or removal in a future release."

Java 15

JEP 381: Entfernung der Solaris and SPARC Ports

  • Aller Solaris/x64 spezifischer Source Code wurde entfernt

  • Aller Solaris/SPARC Architektur spezifischer Code wurde entfernt

  • Dokumentation und Quellcode wurde für zukünftige Releases angepasst

JEP 372: Entfernung der Nashorn JavaScript Engine

  • Bei Release war Nashorn eine vollständige Implementierung des ECMAScript-262 5.1 Standards

  • Die Wartung der sich schnell weiter entwickelnden Sprache war eine sehr große Herausforderung

Folgende zwei JVM-Module werden entfernt:

  • jdk.scripting.nashorn

    • Enthält die jdk.nashorn.api.scripting und jdk.nashorn.api.tree Packages

  • jdk.scripting.nashorn.shell

    • Enthält das jjs tool

JEP 383: Foreign-Memory Access API (Second Incubator)

"Einführung einer API mit der auf außerhalb des Java Heaps liegenden Speicher sicher und effizient zugegriffen werden kann"

  • Ziel: Einfache API um auf externen Speicher (native memory, persistent memory, managed heap memory) zugreifen zu können

  • Es wurde ein neues Modul jdk.incubator.foreign mit gleichnamigen Package eingeführt

Foreign-Memory Access API - Abstraktionen

Es wurden hauptsächlich 3 neue Abstraktionen eingeführt:

  • MemorySegment - modelliert einen zusammenhängenden Speicherbereich

  • MemoryAddress - modelliert eine Speicheradresse

    • checked: Offset in einem bestehenden Memory Segment

    • unchecked: Adresse deren räumliche und zeitliche Begrenzungen unbekannt sind (bspw. Speicheradresse nativer Speicher)

  • MemoryLayout - Programmatische Beschreibung des Inhalts eines Memory Segments

JEP 339: Edwards-Curve Digital Signature Algorithmus (EdDSA)

  • Zusätzlicher Signaturalgorithmus mittels elliptischer Kurven mit Vorteilen über bereits bestehende Algorithmen

  • Ersetzt nicht ECDSA

  • 126 Bits EdDSA ~= 128 Bits ECDSA

  • Plattformunabhängige Implementierung

  • (Nur) In SunEC-Provider verfügbar (Nicht zwangsweise in Anderen)

JEP 373: Überarbeitung der Legacy DatagramSocket API

  • java.net.DatagramSocket und java.net.MulticastSocket sind bereits seit Version 1.0 Teil von Java

  • Die bisherige Implementierung war eine Mischung aus veraltetem Java- und C-Code

  • Schwierig zu maintainen und zu debuggen

  • MulticastSocket im Besonderen war älter als die IPv6 Implementierungen

  • Die alte Implementierung war nicht NIO basiert

Neue Implementierung

ueberarbeitung ds

Quelle: ORACLE

JEP 374: Dekativierung und Deprecation von Biased Locking

  • Vor Java 15 war Biased Locking immer eingeschaltet und verfügbar

  • Biased Locking brachte vor allem vor Java 1.2 Performance-Vorteile (Hashtable, Vector)

  • Heute werden hauptsächlich nicht-synchronisierte Datenstrukturen verwendet

  • Biased Locking ist aufwändig zu maintainen, bei immer geringer werdendem Nutzen

Ab Java 15 ist Biased Locking per Standard deaktiviert

Wieder-einschalten mittels VM-Parameter -XX:+UseBiasedLocking

JEP 377: Zero GC und JEP 379: Shenandoah GC jetzt produktive Features

Die bereits in Java 12 eingeführten alternativen Garbage Collectors:

  • Zero GC

  • Shenandoah GC

sind nicht mehr experimentell und können ohne Freischaltung experimenteller Features genutzt werden.

JEP 358: Helpful NullPointerException *

Gibt zur Laufzeit detailliertere Informationen beim Auftreten einer NullPointerException

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.compareTo(String)" because "a" is null
	at b.j.j15.HelpfulNPE.f(HelpfulNPE.java:9)
	at b.j.j15.HelpfulNPE.main(HelpfulNPE.java:5)
  • War bereits in Java 14 enthalten, dort aber standardmäßig deaktiviert

  • Ab Java 15 standardmäßig aktiviert

  • Kann via VM-Parameter -XX:-ShowCodeDetailsInExceptionMessages deaktiviert werden

Methoden-lokale Interfaces, Enums und Records *

    public static void main(String[] args) {
        interface A { }
        enum Languages { LATIN, FRENCH, GERMAN }
        record C(A a, Languages l) { }
        class B implements A { }
    }

JEP 375: Pattern Matching für instanceof (Second Preview) *

aka Smart Cast light

    Object o = "Hallo JUG Ingolstadt";
    if(o instanceof String s && s.length() > 3) {
        s.indent(3);
    }

JEP 378: Text Blocks *

Erlaubt es im Quelltext Multiline-String-Literale zu definieren

    public static void main(String[] args) {
        String s = """
           Franz jagt
           im komplett verwahrlosten Taxi
           quer durch Bayern
           """;
    }
  • Es handelt sich um ein einziges String-Literal

  • Compiler fügt bei jedem Zeilenumbruch plattformunabhängig ein \n ein

  • Die Einrückung orientiert sich am sich am weitesten nach links eingerückten Zeile

Text Blocks: weitere Eigenschaften

  • Soll der letzte Zeilenumbruch vermieden werden, muss der letzte """ hinter den Text

  • Programmatische Einrückung über neue String-Methode indent(int n)

  • Innerhalb des Textblocks dürfen einzelne " vorkommen

  • Kein Support für String-Templates

JEP 384: Records (Second Preview) *

Records sind immutable, Struct-artige Datenklassen

public record Car(String brand, String model, int horsepower) { }
  • Werden durch record Schlüsselwort eingeleitet

  • Erzeugung durch Aufruf des kanonischen Konstruktors

  • Immutable properties werden in einen kanonischen Konstruktor-Parameter übergeben

  • Deren Namen sind zugleich die Namen der Accessor-Methoden (Nicht Beans-konform)

  • equals() und hashCode() werden auf Basis der Properties-Werte generiert

Records: Weitere Eigenschaften

  • Weitere Konstruktoren können erstellt werden, diese müssen aber an den kanonischen delegieren

  • Die Immutability ist "flach"

    • Inhalte von Collections können verändert werden

    • Es wird nicht in immutable Collections umkopiert

  • Records können nicht von anderen Klassen erben

  • Andere Klassen können nicht von Records erben

  • Reflection-Unterstützung von Records

    • Class#isRecord()

    • Class#getRecordComponents()

JEP 360: Sealed Types *

Für sealed Typen (Interfaces, Klassen) können die Untertypen eingeschränkt werden.

Hierfür wurden folgende neue (Soft)-Schlüsselwörter eingeführt:

  • sealed

  • permits

  • non-sealed

Die Subtypen des sealed Typen müssen sich im gleichen Package (oder ggf. Modul) befinden

Der sealed Obertyp

public sealed class Vehicle permits Car, Truck, MoonRanger {
}
  • sealed markiert Klasse als geschlossene Klasse

  • permits leitet die Liste der erlaubten Subtypen ein

Die Untertypen des sealed Typs

Ein Untertyp eines sealed Typs muss einer der folgenden Eigenschaften besitzen:

  • selbst wieder eine sealed Typ sein

  • ein final er Typ sein (Keine weiterverbung möglich)

  • ein non-sealed Typ sein

public final class Car extends Vehicle { }
public sealed class Truck extends Vehicle permits MonsterTruck { }
public non-sealed class MoonRanger extends Vehicle{ }

Befinden sich alle Klassen in einer Datei, kann permits am sealed Typen weggelassen werden

Reflection-Unterstützung für sealed Typen

  • boolean : Class # isSealed()

  • ClassDesc[] : Class # permittedSubclasses()

JEP 371: Hidden Classes

  • Erlaubt es, Klassen zu erzeugen, die nicht direkt durch den Bytecode andere Klassen verwendet werden kann

  • Diese Klassen sollen nur von den Frameworks verwendet werden, die sie erzeugt haben - indirekt via Reflection

  • Erlaubt die Deprecation von sun.misc.Unsafe::defineAnonymousClass