Wir sind ein junger Verein, der es sich zum Ziel gesetzt hat, eine starke Entwickler-Community im Raum Ingolstadt aufzubauen. Als Java-User-Group liegt unser Fokus natürlich auf der Java-Plattform mit all ihren Facetten, jedoch befassen wir uns mit der gesamten Bandbreite der Software-Entwicklung und des Betriebs.
Unser monatlicher Termin ist kostenfrei und offen für jeden.
Unsere Präsenzen im Web:
Dieser Talk ist lizensiert unter CC BY-SA 4.0.
released 2020-11-10
Jochen Bürkle
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
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."
371: Hidden Classes
378: Text Blocks
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
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
"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
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
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)
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
Quelle: ORACLE
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
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.
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
public static void main(String[] args) {
interface A { }
enum Languages { LATIN, FRENCH, GERMAN }
record C(A a, Languages l) { }
class B implements A { }
}
aka Smart Cast light
Object o = "Hallo JUG Ingolstadt";
if(o instanceof String s && s.length() > 3) {
s.indent(3);
}
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
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
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
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()
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
public sealed class Vehicle permits Car, Truck, MoonRanger {
}
sealed markiert Klasse als geschlossene Klasse
permits leitet die Liste der erlaubten Subtypen ein
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
boolean : Class # isSealed()
ClassDesc[] : Class # permittedSubclasses()
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