Was geht mit Java 17?
Jens Seekamp
GEDOPLAN GmbH, Expertenkreis Java, 20.01.2022
Local-Variable Type Inference
Variablendefinition auch ohne Typzuordnung möglich
2
var a = new ArrayList<String>();
Typ-Herleitung automatisch durch Compiler
weniger Schreibaufwand
bessere Lesbarkeit
nur für lokale Variablen
nur bei Wertzuweisng
weniger Polymorphie (vgl. List<String> = ...)
switch ohne Fallstricke
kein Stress mehr mit "fall through" und break
3
var mwstKennzeichen = "reduziert";
var nettoBetrag = 35.00;
var bruttoBetrag = 0.00;
switch (mwstKennzeichen) {
case "voll" -> bruttoBetrag = nettoBetrag * 1.19;
case "reduziert" -> bruttoBetrag = nettoBetrag * 1.07;
case "ohne" -> bruttoBetrag = nettoBetrag;
default ->
System.out.println("unbekanntes Mehrwertsteuer-Kennzeichen");
};
Switch Expressions
switch als Ausdruck, der einen Wert liefert
4
var code = 0;
String orderState = switch (code) {
case 0, 1 -> "booked";
case 2 -> "confirmed";
case 3 -> { String result = "canceled";
if (...) { result = "another state" }
yield result;
}
default: yield "undefined";
};
Text Blocks
mehrzeilige Textkonstanten als Textblöcke
Hurra, jetzt ist JDBC endlich gut - oder nur "schön"?
5
String sql = """
SELECT ID, FORENAME, SURNAME FROM PERSON
WHERE COUNTRY = 'D'
ORDER BY SURNAME, FORENAME
""";
Text Blocks
nützlich im Test-Umfeld für Testdaten
6
String person = """
{
id: 4711,
forename: "Maxime",
surname: "Musterfrau",
birthday: "1963-10-17",
country: "D"
}
""";
Algebraische Datentypen und Pattern Matching
7
Records
Sealed Classes
instanceof
switch
Enumeration
Array
Was sind algebraische Datentypen?
8
algebraische
Struktur
(ℝ, +,×)
(𝒯,⊕,⊗)
y = 2 × x 3,25
+
Double
Integer
Produkttyp ⊗
Summentyp ⊕
String
Produkttyp und Summentyp - formal
9
Produkttyp P bildet kartesisches Produkt
von Datentypen T1,...,Tn
P = T1  ...  Tn
S = T1  ...  Tn
Summentyp S bildet disjunkte Vereingung
von Datentypen T1,...,Tn
fange ich in Java doch nix mit an
funktionale Programmiersprachen z. B. Haskell
Produkttypen - Beispiele
10
vgl. java.time.LocalDate und java.time.Month
Datum:
Date = Integer  Month  Integer
vgl. java.awt.Point
Koordinatenpunkt:
Point = Double  Double
vgl. java.util.List<E>
Liste von ganzen Zahlen:
List<Integer> = Integer  ...  Integer
homogen
Summentypen - Beispiele
11
geometrische Figur:
Shape = Circle  Rectangle  Polygon mit
Circle = Point  Double
Rectangle = Point  Point
Polygon = Point  ...  Point
Aufzählungstypen sind Spezialfälle:
java.time.DayOfWeek = MONDAY  ...  SUNDAY
java.lang.Boolean = TRUE  FALSE
Rekursiver Summentyp z. B.
BinaryTree
Summen- und Produkttypen in Java
Summentypen werden in Java als versiegelte (sealed) Typen
dargestellt
Produkttypen werden in Java als Records dargestellt
Fachliches Beispiel
Domäne "Online-Shop"
Teilschritt "Bezahlen der Bestellung"
Modellierung verschiedener Zahlungsarten
12
Verarbeiten der Zahlung für eine Bestellung
13
Kategorisierung der möglichen Zahlungsarten
14
Versiegelte Typen
Ziel ist Steuerung der Vererbungs-Hierarchie
allgemeine Nutzbarkeit
eingeschränkte Ableitbarkeit
Schlüsselwörter
sealed  versiegelter Typ
permits  Liste der zulässigen Untertypen
non-sealed  nicht-versiegelter Typ
15
Versiegeln einer Schnittstelle
Schnittstelle OrderPayment soll nur 3 modellierte Unterklassen
haben können
16
public sealed interface OrderPayment
permits FirstDeliverThenPay,
FirstPayThenDeliver,
CreditCard { ...
mögliche Zahlungsarten
Verfeinerung der Zahlungskategorie
FirstDeliverThenPay in 2 Unterarten
17
final non-sealed
sealed
Versiegeln einer Klasse
versiegelte Oberklasse
18
zulässige Unterklassen
public final class PurchaseOnInvoice
extends FirstDeliverThenPay { ...
public non-sealed class PaymentUponCollection
extends FirstDeliverThenPay { ...
public abstract sealed class FirstDeliverThenPay
implements OrderPayment
permits PurchaseOnInvoice,
PaymentUponCollection { ...
mögliche Zahlungsarten
Verfeinerung der Zahlungskategorie FirstPayThenDeliver
19
sealed
final final final
Bewertung versiegelter Typen
genauere Modellierung der Domäne
Abstraktion nach wie vor möglich
weniger defensive Programmierung möglich
nicht zulässige neue Unterklassen liefern einen Compiler-
Fehler
nicht mehr so flexible Vererbung möglich
20
Records
Record ist Klasse mit folgenden Eigenschaften
(implizit) finale Klasse
Instanzen sind unveränderbar (immutable)
21
public record Person(String forename, String surname) {}
Records verfügen (implizit) über
parametrisierten Konstruktor
Accessor-Methoden für lesenden Zugriff auf die Attribute
Person person = new Person("Silke", "Musterfrau");
String forename = person.forename();
Einbetten von Bankdaten in Zahlungsarten
einige Zahlungsarten benötigen Daten einer Bankverbindung
22
Record für Daten der Bankverbindung
Verfeinerung der Zahlungsart "Kreditkarte"
Produkttyp kann als Variante in Summentyp verwendet werden
23
sealed
final
Records mit variabler Komponenten-Anzahl
letzter Komponenten-Typ kann T... sein
24
record NamedTuple(String name, Double... values) { }
new NamedTuple("Vektor_1", 0.5);
new NamedTuple("Vektor_2", 1.5, 4.234, 8.63);
Bewertung Records
einfache Implementierung von Daten-Objekten
kein Boiler-Plate-Code
unveränderbare Objekte (vgl. DDD Value Object)
neue Art von Klassen (vgl. zukünftige Entwicklung "primitive
objects")
25
Pattern Matching (Mustervergleich)
Pattern Matching ist ein symbolverarbeitendes
Verfahren, welches anhand eines vorgegebenen
Musters Teile einer diskreten Struktur identifiziert
dabei beschreibt ein Suchmuster mittels Meta-
Symbolen eine Menge von diskreten Teilstrukturen
26
kenn' ich von Java nicht
Pattern Matching zur Datenverarbeitung - Beispiel
Textersetzung in Zeichenketten
diskrete Struktur (java.lang.String)
Otto Mustermann
Suchmuster als regulärer Ausdruck (Pattern)
t{2}
musterbasierte Transformation (Textersetzung)
replaceAll("t{2}", "nn")
 Onno Mustermann
27
Pattern Matching zur Definition von Funktionen -
Beispiel
Fibonacci-Folge
mathematische Definition als Fallunterscheidung
Programm-Code in Haskell mit Pattern Matching
28
fib :: (Integral n) => n -> n
fib 0 = 0
fib 1 = 1
fib n = fib(n-1) + fib(n-2)
Java
42
Systematik des Pattern Matching
Pattern Matching für algebraische Datentypen
für Summentyp
Type Pattern
für instanceof
für switch
Enum (spezieller Summentyp)
für switch
für Produkttyp
Record Pattern
Array Pattern (homogener Produkttyp)
29
Type Pattern für instanceof
ermöglicht Wegfall von Type Castings
30
FirstDeliverThenPay payment = ...;
if (payment instanceof PurchaseOnInvoice poi) {
return poi.fooOnInvoice();
}
else if (payment instanceof PaymentUponCollection puc) {
return puc.fooOnCollect();
}
else {
throw new RuntimeException("unknown type of OrderPayment");
}
Type Pattern mit Guarded Pattern
boolesche Bedingung zur weiteren Einschränkung
31
public boolean isNullOrEmpty(Object object) {
return object == null
|| object instanceof String s && s.isBlank()
|| object instanceof Collection c && c.isEmpty();
}
Type Pattern für switch
default-Zweig noch erforderlich
32
public boolean isNullOrEmpty(Object object) {
return switch(object) {
case null -> true;
case String s && s.isBlank() -> true;
case Collection c && c.isEmpty() -> true;
default -> false;
};
}
Type Pattern für switch
kein default-Zweig notwendig bei versiegelten Typen
Compiler prüft Vollständigkeit
33
FirstDeliverThenPay payment = ...;
switch (payment) {
case PurchaseOnInvoice poi -> poi.fooOnInvoice();
case PaymentUponCollection puc -> puc.fooOnCollect();
}
Record Pattern
Record Pattern dient zur Dekonstruktion von Record-Objekten
34
if (object instanceof Person(String f, String s)) {
String name = f + " " + s;
...
Java
18
Array Pattern
Array Pattern dient zur Dekonstruktion von Array-Objekten
35
if (object instanceof String[] {var name1, var name2, ...}) {
System.out.println(name1 + name2);
...
Java
18
Bewertung Pattern Matching
einfachere Implementierung von Objekt-Dekonstruktion
mehr deklarativer Programmier-Stil
Compiler-Unterstützung bei fehlenden / neuen Alternativen
Vermeidung NPE
Pattern können kombiniert / geschachtelt werden
neuer "Happen" für Java als (auch) funktionale
Programmiersprache
36
Vector API
API zur Abbildung
Vektor-Berechnungen im Java-Programm
Vektor-Instruktionen im Befehlssatz des Prozessors
37
23 43 2 4562 -45 0 67 -321
8 lanes scalar (int)
Vector<Integer>  IntVector
Skalare Instruktion vs. Vektor-Instruktion
Multiplikation von ganzen Zahlen mit 3
Quelle: https://en.wikipedia.org/wiki/SIMD
38
Single Instruction Single Data (SISD)
8 Additionen von jeweils 2 Zahlen  8 Instruktions-Zyklen
39
23 43 2 4562 -45 0 67 -321
1 2 3 4 4 3 2 1
24 45 5 4566 -41 3 69 -320
+
=
+ + + + + + +
= = = = = = =
Single Instruction Multiple Data (SIMD)
Vektor-Operation parallel "lanewise"  1 Instruktions-Zyklus
analog: Reduktion als eine Vektor-Operation parallel "cross-lane"
40
23 43 2 4562 -45 0 67 -321
1 2 3 4 4 3 2 1
24 45 5 4566 -41 3 69 -320
+
=
Vector API - wozu?
41
Angewandte Mathematik (Numerik, Finanzwesen, ...)
Verarbeitung von Bild-, Ton- und Videodaten
Kryptographie
Machine Learning
interne JDK-Optimierung
Incubato
r
Vielen Dank!
Schulungen zum Thema: www.gedoplan-it-training.de
Projekt-Beratung und -Unterstützung: www.gedoplan-it-
consulting.de
42

Was geht mit Java 17?

  • 1.
    Was geht mitJava 17? Jens Seekamp GEDOPLAN GmbH, Expertenkreis Java, 20.01.2022
  • 2.
    Local-Variable Type Inference Variablendefinitionauch ohne Typzuordnung möglich 2 var a = new ArrayList<String>(); Typ-Herleitung automatisch durch Compiler weniger Schreibaufwand bessere Lesbarkeit nur für lokale Variablen nur bei Wertzuweisng weniger Polymorphie (vgl. List<String> = ...)
  • 3.
    switch ohne Fallstricke keinStress mehr mit "fall through" und break 3 var mwstKennzeichen = "reduziert"; var nettoBetrag = 35.00; var bruttoBetrag = 0.00; switch (mwstKennzeichen) { case "voll" -> bruttoBetrag = nettoBetrag * 1.19; case "reduziert" -> bruttoBetrag = nettoBetrag * 1.07; case "ohne" -> bruttoBetrag = nettoBetrag; default -> System.out.println("unbekanntes Mehrwertsteuer-Kennzeichen"); };
  • 4.
    Switch Expressions switch alsAusdruck, der einen Wert liefert 4 var code = 0; String orderState = switch (code) { case 0, 1 -> "booked"; case 2 -> "confirmed"; case 3 -> { String result = "canceled"; if (...) { result = "another state" } yield result; } default: yield "undefined"; };
  • 5.
    Text Blocks mehrzeilige Textkonstantenals Textblöcke Hurra, jetzt ist JDBC endlich gut - oder nur "schön"? 5 String sql = """ SELECT ID, FORENAME, SURNAME FROM PERSON WHERE COUNTRY = 'D' ORDER BY SURNAME, FORENAME """;
  • 6.
    Text Blocks nützlich imTest-Umfeld für Testdaten 6 String person = """ { id: 4711, forename: "Maxime", surname: "Musterfrau", birthday: "1963-10-17", country: "D" } """;
  • 7.
    Algebraische Datentypen undPattern Matching 7 Records Sealed Classes instanceof switch Enumeration Array
  • 8.
    Was sind algebraischeDatentypen? 8 algebraische Struktur (ℝ, +,×) (𝒯,⊕,⊗) y = 2 × x 3,25 + Double Integer Produkttyp ⊗ Summentyp ⊕ String
  • 9.
    Produkttyp und Summentyp- formal 9 Produkttyp P bildet kartesisches Produkt von Datentypen T1,...,Tn P = T1  ...  Tn S = T1  ...  Tn Summentyp S bildet disjunkte Vereingung von Datentypen T1,...,Tn fange ich in Java doch nix mit an funktionale Programmiersprachen z. B. Haskell
  • 10.
    Produkttypen - Beispiele 10 vgl.java.time.LocalDate und java.time.Month Datum: Date = Integer  Month  Integer vgl. java.awt.Point Koordinatenpunkt: Point = Double  Double vgl. java.util.List<E> Liste von ganzen Zahlen: List<Integer> = Integer  ...  Integer homogen
  • 11.
    Summentypen - Beispiele 11 geometrischeFigur: Shape = Circle  Rectangle  Polygon mit Circle = Point  Double Rectangle = Point  Point Polygon = Point  ...  Point Aufzählungstypen sind Spezialfälle: java.time.DayOfWeek = MONDAY  ...  SUNDAY java.lang.Boolean = TRUE  FALSE Rekursiver Summentyp z. B. BinaryTree
  • 12.
    Summen- und Produkttypenin Java Summentypen werden in Java als versiegelte (sealed) Typen dargestellt Produkttypen werden in Java als Records dargestellt Fachliches Beispiel Domäne "Online-Shop" Teilschritt "Bezahlen der Bestellung" Modellierung verschiedener Zahlungsarten 12
  • 13.
    Verarbeiten der Zahlungfür eine Bestellung 13
  • 14.
  • 15.
    Versiegelte Typen Ziel istSteuerung der Vererbungs-Hierarchie allgemeine Nutzbarkeit eingeschränkte Ableitbarkeit Schlüsselwörter sealed  versiegelter Typ permits  Liste der zulässigen Untertypen non-sealed  nicht-versiegelter Typ 15
  • 16.
    Versiegeln einer Schnittstelle SchnittstelleOrderPayment soll nur 3 modellierte Unterklassen haben können 16 public sealed interface OrderPayment permits FirstDeliverThenPay, FirstPayThenDeliver, CreditCard { ...
  • 17.
    mögliche Zahlungsarten Verfeinerung derZahlungskategorie FirstDeliverThenPay in 2 Unterarten 17 final non-sealed sealed
  • 18.
    Versiegeln einer Klasse versiegelteOberklasse 18 zulässige Unterklassen public final class PurchaseOnInvoice extends FirstDeliverThenPay { ... public non-sealed class PaymentUponCollection extends FirstDeliverThenPay { ... public abstract sealed class FirstDeliverThenPay implements OrderPayment permits PurchaseOnInvoice, PaymentUponCollection { ...
  • 19.
    mögliche Zahlungsarten Verfeinerung derZahlungskategorie FirstPayThenDeliver 19 sealed final final final
  • 20.
    Bewertung versiegelter Typen genauereModellierung der Domäne Abstraktion nach wie vor möglich weniger defensive Programmierung möglich nicht zulässige neue Unterklassen liefern einen Compiler- Fehler nicht mehr so flexible Vererbung möglich 20
  • 21.
    Records Record ist Klassemit folgenden Eigenschaften (implizit) finale Klasse Instanzen sind unveränderbar (immutable) 21 public record Person(String forename, String surname) {} Records verfügen (implizit) über parametrisierten Konstruktor Accessor-Methoden für lesenden Zugriff auf die Attribute Person person = new Person("Silke", "Musterfrau"); String forename = person.forename();
  • 22.
    Einbetten von Bankdatenin Zahlungsarten einige Zahlungsarten benötigen Daten einer Bankverbindung 22 Record für Daten der Bankverbindung
  • 23.
    Verfeinerung der Zahlungsart"Kreditkarte" Produkttyp kann als Variante in Summentyp verwendet werden 23 sealed final
  • 24.
    Records mit variablerKomponenten-Anzahl letzter Komponenten-Typ kann T... sein 24 record NamedTuple(String name, Double... values) { } new NamedTuple("Vektor_1", 0.5); new NamedTuple("Vektor_2", 1.5, 4.234, 8.63);
  • 25.
    Bewertung Records einfache Implementierungvon Daten-Objekten kein Boiler-Plate-Code unveränderbare Objekte (vgl. DDD Value Object) neue Art von Klassen (vgl. zukünftige Entwicklung "primitive objects") 25
  • 26.
    Pattern Matching (Mustervergleich) PatternMatching ist ein symbolverarbeitendes Verfahren, welches anhand eines vorgegebenen Musters Teile einer diskreten Struktur identifiziert dabei beschreibt ein Suchmuster mittels Meta- Symbolen eine Menge von diskreten Teilstrukturen 26 kenn' ich von Java nicht
  • 27.
    Pattern Matching zurDatenverarbeitung - Beispiel Textersetzung in Zeichenketten diskrete Struktur (java.lang.String) Otto Mustermann Suchmuster als regulärer Ausdruck (Pattern) t{2} musterbasierte Transformation (Textersetzung) replaceAll("t{2}", "nn")  Onno Mustermann 27
  • 28.
    Pattern Matching zurDefinition von Funktionen - Beispiel Fibonacci-Folge mathematische Definition als Fallunterscheidung Programm-Code in Haskell mit Pattern Matching 28 fib :: (Integral n) => n -> n fib 0 = 0 fib 1 = 1 fib n = fib(n-1) + fib(n-2) Java 42
  • 29.
    Systematik des PatternMatching Pattern Matching für algebraische Datentypen für Summentyp Type Pattern für instanceof für switch Enum (spezieller Summentyp) für switch für Produkttyp Record Pattern Array Pattern (homogener Produkttyp) 29
  • 30.
    Type Pattern fürinstanceof ermöglicht Wegfall von Type Castings 30 FirstDeliverThenPay payment = ...; if (payment instanceof PurchaseOnInvoice poi) { return poi.fooOnInvoice(); } else if (payment instanceof PaymentUponCollection puc) { return puc.fooOnCollect(); } else { throw new RuntimeException("unknown type of OrderPayment"); }
  • 31.
    Type Pattern mitGuarded Pattern boolesche Bedingung zur weiteren Einschränkung 31 public boolean isNullOrEmpty(Object object) { return object == null || object instanceof String s && s.isBlank() || object instanceof Collection c && c.isEmpty(); }
  • 32.
    Type Pattern fürswitch default-Zweig noch erforderlich 32 public boolean isNullOrEmpty(Object object) { return switch(object) { case null -> true; case String s && s.isBlank() -> true; case Collection c && c.isEmpty() -> true; default -> false; }; }
  • 33.
    Type Pattern fürswitch kein default-Zweig notwendig bei versiegelten Typen Compiler prüft Vollständigkeit 33 FirstDeliverThenPay payment = ...; switch (payment) { case PurchaseOnInvoice poi -> poi.fooOnInvoice(); case PaymentUponCollection puc -> puc.fooOnCollect(); }
  • 34.
    Record Pattern Record Patterndient zur Dekonstruktion von Record-Objekten 34 if (object instanceof Person(String f, String s)) { String name = f + " " + s; ... Java 18
  • 35.
    Array Pattern Array Patterndient zur Dekonstruktion von Array-Objekten 35 if (object instanceof String[] {var name1, var name2, ...}) { System.out.println(name1 + name2); ... Java 18
  • 36.
    Bewertung Pattern Matching einfachereImplementierung von Objekt-Dekonstruktion mehr deklarativer Programmier-Stil Compiler-Unterstützung bei fehlenden / neuen Alternativen Vermeidung NPE Pattern können kombiniert / geschachtelt werden neuer "Happen" für Java als (auch) funktionale Programmiersprache 36
  • 37.
    Vector API API zurAbbildung Vektor-Berechnungen im Java-Programm Vektor-Instruktionen im Befehlssatz des Prozessors 37 23 43 2 4562 -45 0 67 -321 8 lanes scalar (int) Vector<Integer>  IntVector
  • 38.
    Skalare Instruktion vs.Vektor-Instruktion Multiplikation von ganzen Zahlen mit 3 Quelle: https://en.wikipedia.org/wiki/SIMD 38
  • 39.
    Single Instruction SingleData (SISD) 8 Additionen von jeweils 2 Zahlen  8 Instruktions-Zyklen 39 23 43 2 4562 -45 0 67 -321 1 2 3 4 4 3 2 1 24 45 5 4566 -41 3 69 -320 + = + + + + + + + = = = = = = =
  • 40.
    Single Instruction MultipleData (SIMD) Vektor-Operation parallel "lanewise"  1 Instruktions-Zyklus analog: Reduktion als eine Vektor-Operation parallel "cross-lane" 40 23 43 2 4562 -45 0 67 -321 1 2 3 4 4 3 2 1 24 45 5 4566 -41 3 69 -320 + =
  • 41.
    Vector API -wozu? 41 Angewandte Mathematik (Numerik, Finanzwesen, ...) Verarbeitung von Bild-, Ton- und Videodaten Kryptographie Machine Learning interne JDK-Optimierung Incubato r
  • 42.
    Vielen Dank! Schulungen zumThema: www.gedoplan-it-training.de Projekt-Beratung und -Unterstützung: www.gedoplan-it- consulting.de 42