Skip to content

Commit 39fc3da

Browse files
author
Nicolai Parlog
committed
Move Sealed classes to 17
1 parent 5cfe65d commit 39fc3da

File tree

15 files changed

+92
-86
lines changed

15 files changed

+92
-86
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ Check out the [jpms](http://blog.codefx.org/tag/jpms/) tag on my blog, [this dem
7272

7373
## Language Changes
7474

75-
* [sealed classes](src/main/java/org/codefx/demo/java_next/lang/sealed) ([JEP 360](https://openjdk.java.net/jeps/360))
75+
* [sealed classes](src/main/java/org/codefx/demo/java17/lang/sealed) (articles [1](https://www.infoq.com/articles/java-sealed-classes/), [2](https://nipafx.dev/java-visitor-pattern-pointless/), [JEP 409](https://openjdk.java.net/jeps/409))
7676
*[`instanceof` pattern matching](src/main/java/org/codefx/demo/java16/lang/instanceof_) (articles [1](https://nipafx.dev/java-pattern-matching/), [2](https://nipafx.dev/java-type-pattern-matching/), [JEP 394](https://openjdk.java.net/jeps/394))
7777
*[text blocks](src/main/java/org/codefx/demo/java15/lang/text_blocks/TextBlocks.java) ([article](https://blog.codefx.org/java/text-blocks), [JEP 378](https://openjdk.java.net/jeps/378))
7878
*[switch expressions](src/main/java/org/codefx/demo/java14/lang/switch_/Switch.java) ([article](https://blog.codefx.org/java/switch-expressions/), [video](https://www.youtube.com/watch?v=1znHEf3oSNI), [JEP 361](https://openjdk.java.net/jeps/361))

src/main/java/org/codefx/demo/java_next/lang/sealed/shape/Circle.java renamed to src/main/java/org/codefx/demo/java17/lang/sealed/Circle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codefx.demo.java_next.lang.sealed.shape;
1+
package org.codefx.demo.java17.lang.sealed;
22

33
public final class Circle implements Shape {
44

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.codefx.demo.java17.lang.sealed;
2+
3+
public class Main {
4+
5+
public static void main(String[] args) {
6+
Shape shape = new Circle(3);
7+
System.out.println(areaMessage(shape));
8+
}
9+
10+
private static String areaMessage(Shape shape) {
11+
if (shape instanceof Circle)
12+
return "Circle: " + shape.area();
13+
else if (shape instanceof Rectangle)
14+
return "Rectangle: " + shape.area();
15+
else if (shape instanceof Triangle)
16+
return "Triangle: " + shape.area();
17+
else if (shape instanceof Unicorn)
18+
return "Unicorn: " + shape.area();
19+
// when not switching over a sealed type
20+
// (but using an if-else chain like here),
21+
// the compiler can't detect completeness,
22+
// so this else branch is still needed
23+
else
24+
throw new IllegalArgumentException();
25+
}
26+
27+
}

src/main/java/org/codefx/demo/java_next/lang/sealed/shape/Rectangle.java renamed to src/main/java/org/codefx/demo/java17/lang/sealed/Rectangle.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
package org.codefx.demo.java_next.lang.sealed.shape;
1+
package org.codefx.demo.java17.lang.sealed;
22

3+
/**
4+
* Rectangle allows one further implementation, namely {@link Square}
5+
* (because it's {@code sealed}).
6+
*/
37
public sealed class Rectangle
48
implements Shape
59
permits Square {

src/main/java/org/codefx/demo/java_next/lang/sealed/shape/RightTriangle.java renamed to src/main/java/org/codefx/demo/java17/lang/sealed/RightTriangle.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
package org.codefx.demo.java_next.lang.sealed.shape;
1+
package org.codefx.demo.java17.lang.sealed;
22

3+
/**
4+
* Because {@link Triangle} isn't sealed, {@code RightTriangle} can implement
5+
* it without having to be {@code final}, {@code sealed}, or {@code non-sealed}
6+
* itself.
7+
*/
38
public class RightTriangle implements Triangle {
49

510
private final double adjacent;
@@ -12,12 +17,6 @@ public RightTriangle(double adjacent, double opposite) {
1217

1318
@Override
1419
public double area() {
15-
interface People { String name(); }
16-
record Person(String name) implements People { }
17-
record Persons(String... names) { }
18-
19-
People p = new Person("John Doe");
20-
2120
return adjacent * opposite / 2;
2221
}
2322

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.codefx.demo.java17.lang.sealed;
2+
3+
/**
4+
* A sealed type can only be (directly) implemented by the permitted
5+
* types, in this case {@link Circle}, {@link Rectangle}, etc.
6+
*
7+
* These classes must explicitly state how they deal with further inheritance.
8+
* Note that they're all either {@code final}, {@code sealed}, or
9+
* {@code non-sealed}.
10+
*/
11+
public sealed interface Shape
12+
permits Circle, Rectangle, Triangle, Unicorn {
13+
14+
double area();
15+
16+
default Shape rotate(double angle) {
17+
return this;
18+
}
19+
20+
}

src/main/java/org/codefx/demo/java_next/lang/sealed/shape/Square.java renamed to src/main/java/org/codefx/demo/java17/lang/sealed/Square.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codefx.demo.java_next.lang.sealed.shape;
1+
package org.codefx.demo.java17.lang.sealed;
22

33
public final class Square extends Rectangle {
44

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.codefx.demo.java17.lang.sealed;
2+
3+
/**
4+
* {@code Triangle} allows unlimited further implementations
5+
* (because it's {@code non-sealed}).
6+
*/
7+
public non-sealed interface Triangle extends Shape {
8+
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.codefx.demo.java17.lang.sealed;
2+
3+
/**
4+
* Because records are implicitly final, they are a convenient way
5+
* to implement/extend a sealed type.
6+
*/
7+
public record Unicorn(String name, double area) implements Shape {
8+
9+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.codefx.demo.java17.lang.sealed.self_contained;
2+
3+
/**
4+
* If a sealed type's source file contain all its intended
5+
* implementations, no `permits` clause is needed
6+
*/
7+
sealed interface Shape { }
8+
9+
non-sealed interface Circle extends Shape { }
10+
11+
non-sealed interface Triangle extends Shape { }
12+
13+
non-sealed interface Rectangle extends Shape { }

0 commit comments

Comments
 (0)