diff --git a/slides.md b/slides.md index 655381b..9a053bb 100644 --- a/slides.md +++ b/slides.md @@ -276,7 +276,7 @@ --- -# JEPs +# Links - [Switch expressions](https://openjdk.org/jeps/361) 14 - [Records](https://openjdk.org/jeps/395) 16 @@ -284,4 +284,5 @@ - [Pattern matching for switch](https://openjdk.org/jeps/441) 21 - [Record patterns](https://openjdk.org/jeps/440) 21 - [Unnamed variables and patterns](https://openjdk.org/jeps/456) 22 -- [Primitive types in patterns](https://openjdk.org/jeps/455) 23 (1st preview) \ No newline at end of file +- [Primitive types in patterns](https://openjdk.org/jeps/455) 23 (1st preview) +- [Data Oriented Programmig](https://www.infoq.com/articles/data-oriented-programming-java/) Brian Goetz \ No newline at end of file diff --git a/snippets/Expr.java b/snippets/Expr.java new file mode 100644 index 0000000..8ad42bb --- /dev/null +++ b/snippets/Expr.java @@ -0,0 +1,39 @@ +package snippets; + +public sealed interface Expr { + + record Lit(int value) implements Expr {} + record Sum(Expr left, Expr right) implements Expr {} + record Diff(Expr left, Expr right) implements Expr {} + record Times(Expr left, Expr right) implements Expr {} + + default int evaluate() { + return switch (this) { + case Lit(var value) -> value; + case Sum(var left, var right) -> left.evaluate() + right.evaluate(); + case Diff(var left, var right) -> left.evaluate() - right.evaluate(); + case Times(var left, var right) -> left.evaluate() * right.evaluate(); + }; + } + + static Expr lit(int value) { + return new Lit(value); + } + + static Expr sum(Expr left, Expr right) { + return new Sum(left, right); + } + + static Expr diff(Expr left, Expr right) { + return new Diff(left, right); + } + + static Expr times(Expr left, Expr right) { + return new Times(left, right); + } + + static void run() { + sum(lit(1), lit(2)).evaluate(); // 3 + sum(diff(lit(10), lit(8)), lit(2)).evaluate(); // 4 + } +}