Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Jewel Java – What Project Amber offers for deve...

Avatar for Merlin Bögershausen Merlin Bögershausen
March 15, 2022
54

Jewel Java – What Project Amber offers for developers

Java's language features are considered aged and very ceremonial. Verbose source code and workarounds for missing features are the results. It reduces the readability, comprehensibility, and - last, but not least - the productivity of Java developers.

The OpenJDK project Amber attacks these weaknesses of Java with unspectacular JEPs. They only show their full potential in combination and are significant steps for developer productivity.

In this talk, I will show you the results of project Amber and demonstrate the potential of the new language features in combination.

Avatar for Merlin Bögershausen

Merlin Bögershausen

March 15, 2022
Tweet

Transcript

  1. Who am I? 15.03.2022 Merlin Bögershausen - Schmuckes Java -

    Was Projekt Amber für Entwickler:innen bietet 2 Merlin Bögershausen Software Engineer @ adesso SE LOB Public ☕ 🎙 ✈ 🌻 👪
  2. Agenda 15.03.2022 Merlin Bögershausen - Schmuckes Java - Was Projekt

    Amber für Entwickler:innen bietet 3 1 What is a JDK Project & Aim of Project Amber 2 3 Syntactic Sugar 4 Enhancements to Java Type System 5 Pattern matching for Java Code Example
  3. What are JDK Projects at all? 15.03.2022 Merlin Bögershausen -

    Schmuckes Java - Was Projekt Amber für Entwickler:innen bietet 4 A Project is a collaborative effort to produce a specific artifact, which may be a body of code, or documentation, or some other material. OpenJDK Bylaws section 6
  4. Aim of project Amber 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 5 The goal of Project Amber is to explore and incubate smaller, productivity-oriented Java language features Project Amber main page
  5. Merlin Bögershausen - Schmuckes Java - Was Projekt Amber für

    Entwickler:innen bietet 15.03.2022 6 Syntactic Sugar
  6. JEP-286: Local-Variable Type Inference 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 7 List<String> lineList = new ArrayList<String>(); // no duplications var lines = new ArrayList<String>(); final var readLines = lines.size(); FAQ Style Guidelines
  7. JEP-286: Local-Variable Type Inference 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 8 • Less ceremony for locals • Less complex types • Catch up with competing languages (C++, Scala, Go) List<String> lineList = new ArrayList<String>(); // no duplications var lines = new ArrayList<String>(); final var readLines = lines.size(); • Immediate initialization • No initial null assignment • Beware of empty diamonds https://openjdk.java.net/jeps/286 https://openjdk.java.net/projects/amber/guides/lvti-faq https://openjdk.java.net/projects/amber/guides/lvti-style-guide
  8. Local-Variable Type Inference - Example 15.03.2022 Merlin Bögershausen - Schmuckes

    Java - Was Projekt Amber für Entwickler:innen bietet 9 void removeMatches(Map<? extends String, ? extends Number> map, int max) { for (Iterator<? extends Map.Entry<? extends String, ? extends Number>> iterator = map.entrySet().iterator(); iterator.hasNext();) { Map.Entry<? extends String, ? extends Number> entry = iterator.next(); if (max > 0 && matches(entry)) { iterator.remove(); max--; } } }
  9. Local-Variable Type Inference - Example 15.03.2022 Merlin Bögershausen - Schmuckes

    Java - Was Projekt Amber für Entwickler:innen bietet 10 void removeMatches(Map<? extends String, ? extends Number> map, int max) { for (var iterator = map.entrySet().iterator(); iterator.hasNext();) { var entry = iterator.next(); if (max > 0 && matches(entry)) { iterator.remove(); max--; } } }
  10. JEP 323: Local-Variable Syntax for Lambda Parameters 15.03.2022 Merlin Bögershausen

    - Schmuckes Java - Was Projekt Amber für Entwickler:innen bietet 11 BiConsumer<Consumer<String>, String> sink = (x, y) -> x.accept(y); BiConsumer<Consumer<String>, String> safeSink = (@Nonnull var x, var y) -> x.accept(y);
  11. JEP 323: Local-Variable Syntax for Lambda Parameters 15.03.2022 Merlin Bögershausen

    - Schmuckes Java - Was Projekt Amber für Entwickler:innen bietet 12 • Align Syntax implicit type • Allow modifier and annotations BiConsumer<Consumer<String>, String> sink = (x, y) -> x.accept(y); BiConsumer<Consumer<String>, String> safeSink = (@Nonnull var x, var y) -> x.accept(y); • No var and non-var mixing • No explicit and var mixing https://openjdk.java.net/jeps/323
  12. JEP 378: Text Blocks 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 13 String helloWorldResponse = """ <html> <body> <p>Hello, world</p> </body> </html>"""; Programmer’s Guide
  13. JEP 378: Text Blocks 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 14 • Enhance Readability • Simplify multiline Strings • Drop escape sequences String helloWorldResponse = """ <html> <body> <p>Hello, world</p> </body> </html> """; • Mandatory line seperator • No string interpolation • Not raw Stings https://openjdk.java.net/jeps/323 https://openjdk.java.net/projects/amber/guides/text-blocks-guide
  14. JEP 361: Switch Expressions 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 15 int j = switch (day) {// enum Days {MONDAY, …} case MONDAY, null -> 0; case TUESDAY -> 1; default -> { int k = day.toString().length(); yield k; } };
  15. JEP 406: Switch Expressions 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 16 • Raise switch to expressions • Fix fall-through semantic int j = switch (day) { case MONDAY -> 0; case TUESDAY -> 1; default -> { int k = day.toString().length(); yield k; } }; • Prepare for pattern matching • Fix fall-through • Throwing exceptions possible https://openjdk.java.net/jeps/406 https://openjdk.java.net/projects/amber/design- notes/patterns/extending-switch-for-patterns
  16. Merlin Bögershausen - Schmuckes Java - Was Projekt Amber für

    Entwickler:innen bietet 15.03.2022 17 Enhancements to Java Type System
  17. JEP 395: Records 15.03.2022 Merlin Bögershausen - Schmuckes Java -

    Was Projekt Amber für Entwickler:innen bietet 18 record Range(int low, int high) { Range { if (low > high) throw new IllegalArgumentException(/**/); } Range(int high) { this(0, high); } int lenght() { return high - low; } }
  18. JEP 395: Records 15.03.2022 Merlin Bögershausen - Schmuckes Java -

    Was Projekt Amber für Entwickler:innen bietet 19 • Enhance with transparent carriers for immutable data • Step towards pattern matching record Range(int low, int high) { Range { if (low > high) throw new IllegalArgumentException(); } Range(int high) { this(0, high); } int lenght() { return high - low; } } • Can only implement not extend • Not only syntactic sugar • Default constructor is conical https://openjdk.java.net/jeps/395 https://openjdk.java.net/projects/amber/design-notes/records-and- sealed-classes
  19. JEP 409: Sealed Classes 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 20 sealed interface Shape { sealed class Cornered implements Shape {} non-sealed class Rectangle implements Cornered {} record Square(int h) extends Cornered {} final class Weirdo implements Shape {} }
  20. JEP 409: Sealed Classes 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 21 • Add heritage control • Add exhaustiveness sealed interface Shape { sealed class Cornered implements Shape {} non-sealed class Rectangle implements Cornered {} record Square(int h) implements Cornered {} final class Weirdo implements Shape {} } • Give control to developers • Add access restrictions • Support pattern matching https://openjdk.java.net/jeps/409 https://openjdk.java.net/projects/amber/design-notes/records-and- sealed-classes
  21. Merlin Bögershausen - Schmuckes Java - Was Projekt Amber für

    Entwickler:innen bietet 15.03.2022 22 Pattern Matching for Java
  22. JEP 394: Pattern Matching for instanceof 15.03.2022 Merlin Bögershausen -

    Schmuckes Java - Was Projekt Amber für Entwickler:innen bietet 23 if (o instanceof Triangle t) System.out.println("Area: “ + t.calculateArea()); else if (!(o instanceof String str)) System.out.println("Not Triangle or String "); else System.out.println("String value is:" + str);
  23. JEP 394: Pattern Matching for instanceof 15.03.2022 Merlin Bögershausen -

    Schmuckes Java - Was Projekt Amber für Entwickler:innen bietet 24 • Allow type patterns as case label • Introduce Guarded Patterns if (o instanceof Triangle t) System.out.println("Area: “ + t.calculateArea()); else if (!(o instanceof String str)) System.out.println("Not Triangle or String "); else System.out.println("String value is:" + str); • Pattern variable in scope where matched • &&, ||, ! modify scope https://openjdk.java.net/jeps/394
  24. JEP 406: Pattern Matching for switch (Preview) 15.03.2022 Merlin Bögershausen

    - Schmuckes Java - Was Projekt Amber für Entwickler:innen bietet 25 switch (s) { case Triangle t && (t.calculateArea() > 100) -> System.out.println("Large"); case Triangle t -> System.out.println("Small"); default -> System.out.println("Non-triangle"); }
  25. JEP 406: Pattern Matching for switch (Preview) 15.03.2022 Merlin Bögershausen

    - Schmuckes Java - Was Projekt Amber für Entwickler:innen bietet 26 • Allow type patterns as case label • Introduce Guarded Patterns switch (s) { case Triangle t && (t.calculateArea() > 100) -> System.out.println("Large"); case Triangle t -> System.out.println("Small"); default -> System.out.println("Non-triangle"); } • Dominant patterns • Null match no type • Its just the Beginning https://openjdk.java.net/jeps/406 https://openjdk.java.net/projects/amber/design- notes/patterns/type-patterns-in-switch
  26. JEP 405: Record Patterns (Preview) 15.03.2022 Merlin Bögershausen - Schmuckes

    Java - Was Projekt Amber für Entwickler:innen bietet 27 record Point(int x, int y) {} void printSum(Object o) { if (o instanceof Point(int x, var y)) { System.out.println(x+y); } } No Target
  27. JEP 405: Record Patterns (Preview) 15.03.2022 Merlin Bögershausen - Schmuckes

    Java - Was Projekt Amber für Entwickler:innen bietet 28 • Add record deconstruction pattern record Point(int x, int y) {} void printSum(Object o) { if (o instanceof Point(int x, int y)) { System.out.println(x+y); } } • Works with generics • Works with var • Can be nested https://openjdk.java.net/jeps/405 https://openjdk.java.net/projects/amber/design- notes/patterns/type-patterns-in-switch
  28. Still open and Drafts 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 29 • JEP 302: Lambda Leftovers • Underscore for unused • Shadowing by parameters • Fix some ambigues sematic • JEP 348: Compiler Intrinsics for Java SE APIs • Optimizations for Compiler • JEP draft: Concise Method Bodies • JEP draft: String Templates (Preview) BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i); ToIntFunction<String> lenFn = String::length; int x = 10, y = 20; TemplatedString s = "\{x} + \{y} = \{x + y}"; // Concatenation: 10 + 20 = 30
  29. Thanks for your time! 15.03.2022 Merlin Bögershausen - Schmuckes Java

    - Was Projekt Amber für Entwickler:innen bietet 37 [email protected] @MBoegie