140
Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Manuel Mauky@manuel_mauky

Unveränderliche Daten im GriffImmutable Data mit Java

Page 2: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Manuel Mauky@manuel_mauky

www.lestard.eugithub.com/lestard

Page 3: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Immutable Object

"An immutable object is an object whose state cannot be modified after it is created"

wikipedia

Page 4: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

- Immutable Data und funktionale Programmierung?- Nutzen?- Herausforderungen?- Immutable Collections- Immutable Objekte- Optics- andere JVM-Sprachen

- Kotlin- Frege

Page 5: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Immutable Data und

Funktionale Programmierung?

Page 6: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Definition "pure Funktion"- Das Ergebnis der Funktion hängt nur von den Argumenten ab

- Bei gleichen Argumenten liefert die Funktion stets das gleiche Ergebnis

- Die Funktion produziert keine Seiteneffekte

Page 7: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

class SomeClass {

int doSomething(String s) {return s.trim().length();

}

}

Page 8: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

class SomeClass {private int x = 0;

int doSomething(String s) {x = 1;return s.trim().length();

}

}

Page 9: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

class SomeClass {private final int x = 0;

int doSomething(String s) {x = 1; //compile errorreturn s.trim().length();

}

}

Page 10: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

class SomeClass {private final Person person = new Person();

int doSomething(String s) {person.setName(s);

return s.trim().length();}

}

Page 11: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

int x = 0;

Function<String, Integer> doSomething = (s) -> {

x = 1;

return s.trim().length();}

Page 12: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person();

Function<String, Integer> doSomething = (s) -> {

person.setName(s);

return s.trim().length();}

Page 13: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

class SomeClass {

static int doSomething(String s, Person person) {person.setName(s);

return s.trim().length();}

}

Page 14: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Nutzen von Immutable Data

Page 15: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

"Immutable classes are easier to design, implement, and use than mutable classes. They are less prone to error and are more

secure."Joshua Bloch - Effective Java, second edition

Page 16: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Nachvollziehbarkeit von Code

Page 17: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Minimierung von Einflussfaktoren

SomeClass someObject = new SomeClass();

unpureMethod(someObject);

System.out.println(someObject); // ?

Page 18: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

List<String> strings = …

int x = somePureFunction(strings);

int y = x + 15;

Page 19: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

List<String> strings = …

int x = someOtherPureFunction(strings); // replace without worrying

int y = x + 15;

Page 20: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public String doSomething(List<Person> persons) {…

}

Was könnte diese Methode tun?

Page 21: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public String doSomething(List<Person> persons) {…

}

Was könnte diese Methode tun?

Möglichkeiten:- Klassen-Variablen (Felder) lesen, verändern, neu zuweisen- Parameter "persons":

- Elemente hinzufügen, löschen, ersetzen- Instanzen in der Liste verändern- Irgendwo im Code die Referenz neu belegen (person = new ArrayList<>())

- Andere Methoden aufrufen- Seiten-Effekte (z.B. Datenbank-Zugriffe) durchführen- ...

Page 22: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public static String doSomething(List<Person> persons) {…

}

Was könnte diese Methode tun?

Möglichkeiten:- Klassen-Variablen (Felder) lesen, verändern, neu zuweisen- Parameter "persons":

- Elemente hinzufügen, löschen, ersetzen- Instanzen in der Liste verändern- Irgendwo im Code die Referenz neu belegen (persons = new ArrayList<>())

- Andere Methoden aufrufen- Seiten-Effekte (z.B. Datenbank-Zugriffe) durchführen- ...

Page 23: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public static String doSomething(final List<Person> persons) {…

}

Was könnte diese Methode tun?

Möglichkeiten:- Klassen-Variablen (Felder) lesen, verändern, neu zuweisen- Parameter "persons":

- Elemente hinzufügen, löschen, ersetzen- Instanzen in der Liste verändern- Irgendwo im Code die Referenz neu belegen (persons = new ArrayList<>())

- Andere Methoden aufrufen- Seiten-Effekte (z.B. Datenbank-Zugriffe) durchführen- ...

Page 24: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public static String doSomething(final ImmutableList<Person> persons) {…

}

Was könnte diese Methode tun?

Möglichkeiten:- Klassen-Variablen (Felder) lesen, verändern, neu zuweisen- Parameter "persons":

- Elemente hinzufügen, löschen, ersetzen- Instanzen in der Liste verändern- Irgendwo im Code die Referenz neu belegen (person = new ArrayList<>())

- Andere Methoden aufrufen- Seiten-Effekte (z.B. Datenbank-Zugriffe) durchführen- ...

Page 25: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public static String doSomething(final ImmutableList<ImmutablePerson> persons) {…

}

Was könnte diese Methode tun?

Möglichkeiten:- Klassen-Variablen (Felder) lesen, verändern, neu zuweisen- Parameter "persons":

- Elemente hinzufügen, löschen, ersetzen- Instanzen in der Liste verändern- Irgendwo im Code die Referenz neu belegen (person = new ArrayList<>())

- Andere Methoden aufrufen- Seiten-Effekte (z.B. Datenbank-Zugriffe) durchführen- ...

Page 26: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

DebuggingHerausfinden, wo, warum und von wem ein Objekt verändert wurde

Page 27: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Mutation ist easy aber nicht unbedingt simple.

→ Empfehlung: Rich Hickey Talk "Simple made Easy"

easy = schnell und einfach verwendbar

simple = Gegenteil von "Complex"

Page 28: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Immutables sind Thread-Safe

Page 29: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Historisierung

Page 30: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Anforderung:Verschiedene Versionsstände sollen persistiert werden

Page 31: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Anforderung:Verschiedene Versionsstände sollen persistiert werden

SomeObject object = new SomeObject();

object.setValue(15);

object.setValue(30);

Page 32: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Funktionale UI-Entwicklung:Redux

Page 33: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Zustandsbaum

Reducer-Funktion

Action

State reduce(State oldState, Action action) {...

}

Page 34: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

ReduxUI- und Applikations-zustand wird als Immutable Objekt modelliert

Pure Reducer-Funktion bildet aktuellen Zustand auf neuen Zustand ab

UI rendert sich stets passend zum neuen Zustand

Page 35: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Herausforderungen

Page 36: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

HerausforderungenAuch in funktionalen Programmen muss mit Datenänderung umgegangen werden

Statt Objekte zu verändern müssen Kopien erzeugt werden

Herausforderung:

1) Speicher- und Laufzeit-Performance?2) API zum Entwickeln?

Page 37: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Immutable Collections

Page 38: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

List<String> mutableList = new ArrayList<>();mutableList.add("foo");mutableList.add("bar");

List<String> immutableList = Collections.unmodifiableList(mutableList);

Page 39: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

List<String> mutableList = new ArrayList<>();mutableList.add("foo");mutableList.add("bar");

List<String> immutableList = Collections.unmodifiableList(mutableList);

System.out.println(immutableList.size()); // 2

Page 40: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

List<String> mutableList = new ArrayList<>();mutableList.add("foo");mutableList.add("bar");

List<String> immutableList = Collections.unmodifiableList(mutableList);

immutableList.add("baz"); // UnsupportedOperationException

Page 41: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

List<String> mutableList = new ArrayList<>();mutableList.add("foo");mutableList.add("bar");

List<String> immutableList = Collections.unmodifiableList(mutableList);

mutableList.add("baz");

System.out.println(immutableList.size()); //?

Page 42: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

List<String> mutableList = new ArrayList<>();mutableList.add("foo");mutableList.add("bar");

List<String> immutableList = Collections.unmodifiableList(mutableList);

mutableList.add("baz");

System.out.println(immutableList.size()); //3

Page 43: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

(formerly known as Java-Slang)

Page 44: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Vavr- Bibliothek für funktionale Programmierung mit Java

- u.a. Collections Library

- http://www.vavr.io/

Page 45: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

import io.vavr.collection.List;

List<String> list = List.of("foo", "bar");

Page 46: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

import io.vavr.collection.List;

List<String> list = List.of("foo", "bar");

List<String> newList = list.append("baz");

System.out.println(list.size()); // 2

Page 47: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Iterable

Traversable

Seq

IndexedSeq

Array CharSeq Vector Stack List QueueStream

LinearSeq

Page 48: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Iterable

Traversable

Set

SortedSet

LinkedHashSet HashSet TreeSet

Map

SortedMap

LinkedHashMap HashMap TreeMap

Page 49: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

list = list.remove("foo");

Page 50: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

list = list.remove("foo");

list = list.filter(x -> !x.isEmpty());

Page 51: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

list = list.remove("foo");

list = list.filter(x -> !x.isEmpty());

List<Integer> lengths = list.map(x -> x.length());

Page 52: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

list = list.remove("foo");

list = list.filter(x -> !x.isEmpty());

List<Integer> lengths = list.map(x -> x.length());

String folded = list.fold("", (a,b) -> a + "." + b);// ["a","b","c"] => "a.b.c"

Page 53: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Guava Collections

Page 54: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

import com.google.common.collect.ImmutableList;

ImmutableList<String> list = ImmutableList.of("foo", "bar");

Page 55: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

import com.google.common.collect.ImmutableList;

ImmutableList<String> list = ImmutableList.of("foo", "bar");

list = ImmutableList.builder().addAll(list).add("baz").build();

// remove?

Page 56: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

- PCollections

- cli-ds (Clojure collections outside of Clojure)

- functional-java

Andere Bibliotheken

Page 57: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Immutable Objekte

Page 58: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public class Person {private String firstname;private String lastname;

public String getFirstname() {return firstname;

}

public void setFirstname(String name) {this.firstname = name;

}

public String getLastname() {return lastname;

}

public void setLastname(String name) {this.lastname = name;

}}

Page 59: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public class Person {private String firstname;private String lastname;

public String getFirstname() {return firstname;

}

public void setFirstname(String name) {this.firstname = name;

}

public String getLastname() {return lastname;

}

public void setLastname(String name) {this.lastname = name;

}}

Page 60: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public class Person {private String firstname;private String lastname;

public String getFirstname() {return firstname;

}

public String getLastname() {return lastname;

}}

Page 61: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public class Person {private final String firstname;private final String lastname;

public Person(String firstname, String lastname) {this.firstname = firstname;this.lastname = lastname;

}

public String getFirstname() {return firstname;

}

public String getLastname() {return lastname;

}}

Page 62: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public class Person {private final String firstname;private final String lastname;

public Person(String firstname, String lastname) {this.firstname = firstname;this.lastname = lastname;

}

// getters

public boolean equals(Object other) {// generate by IDE

}

public int hashCode() {// generate by IDE

}}

Page 63: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public class Student extends Person {private String studentId;

// constructor

public String getStudentId() {return studentId;

}}

Page 64: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public class Student extends Person {private String studentId;

// constructor

public String getStudentId() {return studentId;

}

public void setStudentId(String studentId) {this.studentId = studentId;

}}

Page 65: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public class Student extends Person {private String studentId;

// constructor

public String getStudentId() {return studentId;

}

public void setStudentId(String studentId) {this.studentId = studentId;

}}

...

Person p = new Student(...);

somePureFunction(p);

p.setStudentId("sima123");

Page 66: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public final class Person {private final String firstname;private final String lastname;

public Person(String firstname, String lastname) {this.firstname = firstname;this.lastname = lastname;

}

// getters + equals + hashCode

}

Page 67: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public final class Person {private final String firstname;private final String lastname;private final Address address;

public Person(String firstname, String lastname, Address address) {this.firstname = firstname;this.lastname = lastname;this.address = address;

}

public Address getAddress() {return address;

}

// getter + equals + hashCode}

Page 68: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Address address = new Address("Görlitz", "02826", "Berliner Straße", "15");

Person person = new Person("Luise", "Müller", address);

Page 69: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Address address = new Address("Görlitz", "02826", "Berliner Straße", "15");

Person person = new Person("Luise", "Müller", address);

person.getAddress().setZipCode("02827");

Page 70: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Wie geht man mit Veränderung um?

Page 71: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public final class Person {private final String firstname;private final String lastname;private final Address address;

public Person(String firstname, String lastname, Address address) {// ...

}

public Person withLastname(String newLastName) {// TODO implement

}

// getter + equals + hashCode}

Page 72: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public final class Person {private final String firstname;private final String lastname;private final Address address;

public Person(String firstname, String lastname, Address address) {// ...

}

public Person withLastname(String newLastname) {return new Person(this.firstname, newLastname, this.address);

}

// getter + equals + hashCode}

Page 73: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public final class Person {private final String firstname;private final String lastname;private final Address address;

public Person(String firstname, String lastname, Address address) {// ...

}

public Person withLastname(String newLastname) {if(this.lastname.equals(newLastname)) {

return this;} else {

return new Person(this.firstname, newLastname, this.address);}

}

// getter + equals + hashCode}

Page 74: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Address address = new Address("City", "Street", "House number");

Person person = new Person("Luise", "Müller", address);

Page 75: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Address address = new Address("City", "Street", "House number");

Person person = new Person("Luise", "Müller", address);

Person newPerson = person.withLastname("Maier");

Page 76: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Address address = new Address("City", "Street", "House number");

Person person = new Person("Luise", "Müller", address);

person = person.withLastname("Maier");

Page 77: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public final class Person {private final String firstname;private final String lastname;private final Address address;private final String emailAddress;

public Person(String firstname, String lastname, Address address) {// ...

}

public Person withLastname(String newLastname) {if(this.lastname.equals(newLastname)) {

return this;} else {

return new Person(this.firstname, newLastname, this.address);}

}

// getter + equals + hashCode}

Page 78: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public final class Person {private final String firstname;private final String lastname;private final Address address;private final String emailAddress;

public Person(String firstname, String lastname, Address address, String email) {// ...

}

public Person withLastname(String newLastname) {if(this.lastname.equals(newLastname)) {

return this;} else {

return new Person(this.firstname, newLastname, this.address);}

}

// getter + equals + hashCode}

Page 79: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

public final class Person {private final String firstname;private final String lastname;private final Address address;private final String emailAddress;

public Person(String firstname, String lastname, Address address, String email) {// ...

}

public Person withLastname(String newLastname) {if(this.lastname.equals(newLastname)) {

return this;} else {

return new Person(this.firstname, newLastname, this.address);}

}

// getter + equals + hashCode}

Page 80: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok

Page 81: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok- lombok Abhängigkeit ins Projekt ziehen- Annotationen setzen- Lombok generiert Boilerplate-Code

https://projectlombok.org/

Page 82: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

@Datapublic class BlogArticle {

String title;String text;Author author;

}

public class BlogArticle { String title; String text;

Author author;

public BlogArticle() { }

public String getTitle() { return this.title; }

public String getText() { return this.text; }

public Author getAuthor() { return this.author; }

public void setTitle(String title) { this.title = title; }

public void setText(String text) { this.text = text; }

public void setAuthor(Author author) { this.author = author; }

public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof BlogArticle)) return false; final BlogArticle other = (BlogArticle) o; if (!other.canEqual((Object) this)) return false; final Object this$title = this.getTitle(); final Object other$title = other.getTitle(); if (this$title == null ? other$title != null : !this$title.equals(other$title)) return false; final Object this$text = this.getText(); final Object other$text = other.getText(); if (this$text == null ? other$text != null : !this$text.equals(other$text)) return false; final Object this$author = this.getAuthor(); final Object other$author = other.getAuthor(); if (this$author == null ? other$author != null : !this$author.equals(other$author)) return false; return true; }

public int hashCode() { final int PRIME = 59; int result = 1; final Object $title = this.getTitle(); result = result * PRIME + ($title == null ? 43 : $title.hashCode()); final Object $text = this.getText(); result = result * PRIME + ($text == null ? 43 : $text.hashCode()); final Object $author = this.getAuthor(); result = result * PRIME + ($author == null ? 43 : $author.hashCode()); return result; }

protected boolean canEqual(Object other) { return other instanceof BlogArticle; }

public String toString() { return "BlogArticle(title=" + this.getTitle() + ", text=" + this.getText() + ", author=" + this.getAuthor() + ")"; }}

vs.

Constructor

Getter + Setter

Equals

HashCode

ToString

Page 83: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok für Immutables@Valuepublic class BlogArticle {

String title;String text;Author author;

}

// Usage

BlogArticle article = new BlogArticle("title", "text", author);

System.out.println(article.getTitle());

Page 84: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok für Immutables@Value@Witherpublic class BlogArticle {

String title;String text;Author author;

}

// Usage

BlogArticle article = new BlogArticle("title", "text", author);

article = article.withTitle("New title");

Page 85: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok für Immutables@Value@Wither@Builderpublic class BlogArticle {

String title;String text;Author author;

}

// Usage

BlogArticle article = BlogArticle.builder().title("Title").text("Text").author(author).build();

Page 86: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok für Immutables@Value@Wither@Builder(toBuilder = true)public class BlogArticle {

String title;String text;Author author;

}

// Usage

BlogArticle article = BlogArticle.builder().title("Title").text("Text").author(author).build();

article = article.toBuilder().title("New Title").build();

Page 87: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok - Kombination mit Collections?@Value@Witherclass BlogArticle {

Seq<Comment> comments;}

// usage

BlogArticle article = new BlogArticle(List.empty());

BlogArtcle article = article.withComments(article.getComments().append(comment));

Page 88: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok - Kombination mit Collections?@Value@Witherclass BlogArticle {

Seq<Comment> comments = List.empty();}

// usage

BlogArticle article = new BlogArticle();

BlogArtcle article = article.withComments(article.getComments().append(comment));

Page 89: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok - Kombination mit Collections?@Value@Witherclass BlogArticle {

Seq<Comment> comments = List.empty();

BlogArticle addComments(Comment...comments) {// ?

}

BlogArticle removeComments(Comment...comments) {// ?

}}

// usage

BlogArticle article = new BlogArticle();

BlogArtcle article = article.addComments(comment);

Page 90: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lombok- guter IDE support

- einfache Integration

- vermeidet Boilerplate

https://projectlombok.org/

- Features für Immutability begrenzt

- Manchmal Probleme im Build-Prozess

- Annotationen sind nicht composable

Page 91: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Immutables.org

Page 92: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Immutables"Java annotation processors to generate simple, safe and consistent value objects"

Setup wie Lombok

https://immutables.github.io/

Page 93: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

@Value.Immutablepublic interface BlogArticle {

String getTitle();String getText();

Author getAuthor();

List<Comment> getComments();}

Page 94: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

// generiertImmutableBlogArticle article = ImmutableBlogArticle.builder()

.title("Title")

.text("Text")

.build();

article = article.withTitle("New Title");

Page 95: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

// generiertImmutableBlogArticle article = ImmutableBlogArticle.builder()

.title("Title")

.text("Text")

.build();

article = article.withComments(comment); // collections support

Page 96: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

// generiertImmutableBlogArticle article = ImmutableBlogArticle.builder()

.title("Title")

.text("Text")

.build();

article.getComments().add(comment); // UnsupportedOperationException

Page 97: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

// generiertImmutableBlogArticle article = ImmutableBlogArticle.builder()

.title("Title")

.text("Text")

.build();

article = ImmutableBlogArticle.builder().from(article).addComments(comment).build();

Page 98: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Immutables.org- Optimiert für unveränderliche Daten

- Umfangreiche Builder werden generiert

- einfache Integration

https://immutables.github.io/

- kein spezieller IDE Support

- funktioniert aber trotzdem ohne Probleme

Page 99: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Immutables.org - Other Features

Page 100: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

[email protected]@Value.Style(

init = "set*",typeAbstract = {"Abstract*"},typeImmutable = "*"

)public interface AbstractBlogArticle {

String getTitle();String getText();

}

// generated Class without "Immutable" prefix

BlogArticle article = BlogArticle.Builder().setTitle("Title").setText("Content").build();

Page 101: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

[email protected]@Value.Modifiableinterface BlogArticle {

String getTitle();String getText();

}

Page 102: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

ModifiableBlogArticle modifiableArticle = ModifiableBlogArticle.create().setTitle("Title").setText("Text");

modifiableArticle.setTitle("New Title");

ImmutableBlogArticle article = modifiableArticle.toImmutable();

Page 103: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

ImmutableBlogArticle article = …

ModifiableBlogArticle modifiableArticle = ModifiableBlogArticle.create().from(article);

modifiableArticle.setTitle("New Title");

article = modifiableArticle.toImmutable();

Page 104: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Deeply Nested Structures

Optics

Page 105: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Address address = new Address("Görlitz", "02826", "Berliner Straße", "15");

Person person = new Person("Luise", "Müller", address);

person.getAddress().setZipCode("02827"); // mutation

Page 106: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Address address = new Address("Görlitz", "02826", "Berliner Straße", "15");

Person person = new Person("Luise", "Müller", address);

person.getAddress().setZipCode("02827");

person = person.withAddress(person.getAddress().withZipCode("02827"));

Page 107: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

City goerlitz = new City("Görlitz", "02826");

Address address = new Address(goerlitz, "Berliner Straße", "15");

Person person = new Person("Luise", "Müller", address);

person.withAddress(person.getAddress().withCity(person.getAddress().getCity().withZipCode("02827")));

Page 108: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Tief verschachtelte Strukturen?

Page 109: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

LensesLens: Objekt, welches auf eine bestimmte Stelle einer Datenstruktur "zeigt".

Page 110: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens personLastnameLens = …

Page 111: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens personLastnameLens = …

String lastname = personLastnameLens.get(person);

System.out.println(lastname); // "Müller"

Page 112: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens personLastnameLens = …

Page 113: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens personLastnameLens = …

Person newPerson = personLastameLens.set("Maier").apply(person);

System.out.println(newPerson.getLastname()); // "Maier"

Page 114: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens personLastnameLens = …

Person newPerson = personLastameLens.set("Maier").apply(person);

System.out.println(newPerson.getLastname()); // "Maier"

System.out.println(person.getLastname()); // "Müller"

Page 115: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

LensesLens: Objekt, welches auf eine bestimmte Stelle einer Datenstruktur "zeigt".

Kann Werte abrufen und "setzen" (Kopie mit geänderten Daten erzeugen)

Page 116: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

LensesLens: Objekt, welches auf eine bestimmte Stelle einer Datenstruktur "schaut".

Kann Werte abrufen und "setzen" (Kopie mit geänderten Daten erzeugen)

Lenses sind composable!

Page 117: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens.lens(person -> person.getAddress(), …)

Page 118: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens.lens(Person::getAddress, …)

Page 119: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens.lens(Person::getAddress, address -> person -> person.withAddress(address))

Page 120: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens<Person, Address> personAddressLens = Lens.lens(Person::getAddress,

address -> person -> person.withAddress(address))

Page 121: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens<Person, Address> personAddressLens = …

Lens<Address, City> addressCityLens = …

Page 122: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens<Person, Address> personAddressLens = …

Lens<Address, City> addressCityLens = …

Lens<City, String> cityZipcodeLens = …

Page 123: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens<Person, Address> personAddressLens = …

Lens<Address, City> addressCityLens = …

Lens<City, String> cityZipcodeLens = …

Lens<Person, String> personZipcodeLens =personAddressLens.compose(addressCityLens).compose(cityZipcodeLens);

Page 124: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Person person = new Person("Luise", "Müller", address);

Lens<Person, Address> personAddressLens = …

Lens<Address, City> addressCityLens = …

Lens<City, String> cityZipcodeLens = …

Lens<Person, String> personZipcodeLens =personAddressLens.compose(addressCityLens).compose(cityZipcodeLens);

Person newPerson = personZipcodeLens.set("02827").apply(person);

System.out.println(newPerson.getAddress().getCity().getZipCode())); // "02827"

Page 125: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Hilfsmittel zum Einsehen und "Verändern" von immutable Objekten

Abstraktion von konkreten Pfad zum Ziel-Wert

→ Ändert sich die Struktur, muss nur die Lens angepasst werden, nicht derbenutzende Code

Optics

Page 126: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Lens: "zeigt" auf einen stets vorhandenen Wert

Prism: "zeigt" auf einen möglicherweise vorhandenen Wert (Optional)

...

Bibliothek: Functional-Java

Optics

Page 127: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Andere JVM-Sprachen

Page 128: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Kotlin

Page 129: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Kotlindata class BlogArticle (

val title: String,val text: String

)

Page 130: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Kotlindata class BlogArticle (

val title: String,val text: String

)

val article = BlogArticle(title="Title", text="Text")

val newArticle = article.copy(title="New Title")

Page 131: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Kotlin Collectionsval list = listOf("foo", "bar")

list.add("baz");

Page 132: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Kotlin Collectionsval list = listOf("foo", "bar")

list.add("baz");

val mutableList = mutableListOf("foo", "bar")

Page 133: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

FregeHaskell for the JVM

Page 134: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

data Person = Person { firstname :: String, lastname :: String }

Page 135: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

data Person = Person { firstname :: String, lastname :: String }

luise = Person "Luise" "Müller"

Page 136: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

data Person = Person { firstname :: String, lastname :: String }

luise = Person "Luise" "Müller"

hugo = Person { lastname = "Bauer", firstname = "Hugo" }

Page 137: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

data Person = Person { firstname :: String, lastname :: String }

luise = Person "Luise" "Müller"

hugo = Person { lastname = "Bauer", firstname = "Hugo" }

luise2 = luise.{ lastname = "Maier" }

Page 138: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Java Value-Types?JEP 169 - Project Valhalla

Page 139: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Project Valhalla: Value-Types für JavaValue-Types existieren direkt auf dem Call Stack und nicht im Heap

Keine Identität → Immutable

Fokus auf Performance und Speicher-Nutzung (keine Dereferenzierung mehr nötig)

"Enable functional-style computation with pure data, for optimized parallel computations."

"Increase safety and security and decrease "defensive copying" in applications which must share structured data across trust boundaries."

Page 140: Unveränderliche Daten im Griff - JUG Saxony Day · 2018-10-17 · Manuel Mauky @manuel_mauky Unveränderliche Daten im Griff Immutable Data mit Java

Fragen?@manuel_mauky

github.com/lestardwww.lestard.eu