Add jep513 module: flexible constructor bodies on JDK 25 and 27

Runnable sources, broken examples and captured transcripts for the ankurm.com JEP 513 article, including the JDK 25 vs 27 compiler wording differences.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TF9JWFvJSNm6HVzswzZU5a
This commit is contained in:
Claude
2026-09-24 10:42:36 +00:00
parent e0cb6e83e2
commit 2ebea58d39
30 changed files with 510 additions and 0 deletions
@@ -0,0 +1,13 @@
$ javac src/ValidateBeforeSuper.java && java ValidateBeforeSuper (OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS))
valid input:
Person constructor ran for 'Asha'
name='Asha' salary=50000
invalid input:
caught: salary must be >= 0, got -1 (note: no 'Person constructor ran' line above)
$ javac src/ValidateBeforeSuper.java && java ValidateBeforeSuper (OpenJDK Runtime Environment Temurin-27+35 (build 27+35))
valid input:
Person constructor ran for 'Asha'
name='Asha' salary=50000
invalid input:
caught: salary must be >= 0, got -1 (note: no 'Person constructor ran' line above)
+9
View File
@@ -0,0 +1,9 @@
$ javac src/BeforeJava25.java && java BeforeJava25 (OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS))
Person constructor ran for 'Asha'
name='Asha' salary=50000
caught: salary must be >= 0, got -1
$ javac src/BeforeJava25.java && java BeforeJava25 (OpenJDK Runtime Environment (build 21.0.10+7-Ubuntu-124.04))
Person constructor ran for 'Asha'
name='Asha' salary=50000
caught: salary must be >= 0, got -1
@@ -0,0 +1,11 @@
$ javac broken/OnJdk21.java && java OnJdk21 (OpenJDK Runtime Environment (build 21.0.10+7-Ubuntu-124.04))
broken/OnJdk21.java:7: error: call to super must be first statement in constructor
super(name.strip());
^
1 error
$ javac broken/OnJdk21.java && java OnJdk21 (OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS))
constructed
$ javac broken/OnJdk21.java && java OnJdk21 (OpenJDK Runtime Environment Temurin-27+35 (build 27+35))
constructed
@@ -0,0 +1,5 @@
$ javac src/OverridableCall.java && java OverridableCall (OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS))
Broken (assign after super()):
Base constructor calls describe(): label=null
Fixed (assign before super()):
Base constructor calls describe(): label=hello
+11
View File
@@ -0,0 +1,11 @@
$ javac src/ParseThenSuper.java && java ParseThenSuper (OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS))
design review at 09:05
bad input failed before Time was built: NumberFormatException
$ javac src/TryInPrologue.java && java TryInPrologue (OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS))
configured '9090' -> port 9090
configured 'oops' -> port 8080
$ javac src/ThisChaining.java && java ThisChaining (OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS))
critical-payment retries=5
report-export retries=1
+13
View File
@@ -0,0 +1,13 @@
$ javap -c -p 'PrologueBytecode$Child' (OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS))
class PrologueBytecode$Child extends PrologueBytecode$Parent {
PrologueBytecode$Child(int);
Code:
0: iload_1
1: iconst_0
2: invokestatic #1 // Method java/lang/Math.max:(II)I
5: istore_2
6: aload_0
7: iload_2
8: invokespecial #7 // Method PrologueBytecode$Parent."<init>":(I)V
11: return
}
@@ -0,0 +1,79 @@
$ javac broken/ReadFieldBeforeSuper.java (25.0.4.1+1)
ReadFieldBeforeSuper.java:5: error: cannot reference size before supertype constructor has been called
1 error
$ javac broken/ReadFieldBeforeSuper.java (27+35)
ReadFieldBeforeSuper.java:5: error: reference to size may only appear after an explicit constructor invocation
1 error
$ javac broken/CallMethodBeforeSuper.java (25.0.4.1+1)
CallMethodBeforeSuper.java:5: error: cannot reference compute() before supertype constructor has been called
1 error
$ javac broken/CallMethodBeforeSuper.java (27+35)
CallMethodBeforeSuper.java:5: error: reference to compute() may only appear after an explicit constructor invocation
1 error
$ javac broken/PassThisBeforeSuper.java (25.0.4.1+1)
PassThisBeforeSuper.java:4: error: cannot reference this before supertype constructor has been called
1 error
$ javac broken/PassThisBeforeSuper.java (27+35)
PassThisBeforeSuper.java:4: error: reference to this may only appear after an explicit constructor invocation
1 error
$ javac broken/ReadFinalBeforeAssign.java (25.0.4.1+1)
ReadFinalBeforeAssign.java:5: error: cannot reference this before supertype constructor has been called
1 error
$ javac broken/ReadFinalBeforeAssign.java (27+35)
ReadFinalBeforeAssign.java:5: error: reference to this may only appear after an explicit constructor invocation
1 error
$ javac broken/InnerOuterThis.java (25.0.4.1+1)
InnerOuterThis.java:5: error: cannot reference x before supertype constructor has been called
1 error
$ javac broken/InnerOuterThis.java (27+35)
InnerOuterThis.java:5: error: reference to x may only appear after an explicit constructor invocation
1 error
$ javac broken/NewInnerBeforeSuper.java (25.0.4.1+1)
NewInnerBeforeSuper.java:5: error: cannot reference this before supertype constructor has been called
1 error
$ javac broken/NewInnerBeforeSuper.java (27+35)
NewInnerBeforeSuper.java:5: error: reference to this may only appear after an explicit constructor invocation
1 error
$ javac broken/AssignFieldWithInitializer.java (25.0.4.1+1)
AssignFieldWithInitializer.java:5: error: cannot assign initialized field 'size' before supertype constructor has been called
1 error
$ javac broken/AssignFieldWithInitializer.java (27+35)
AssignFieldWithInitializer.java:5: error: assignment to initialized field 'size' may only appear after an explicit constructor invocation
1 error
$ javac broken/AssignInheritedField.java (25.0.4.1+1)
AssignInheritedField.java:4: error: cannot reference shared before supertype constructor has been called
1 error
$ javac broken/AssignInheritedField.java (27+35)
AssignInheritedField.java:4: error: reference to shared may only appear after an explicit constructor invocation
1 error
$ javac broken/ReturnBeforeSuper.java (25.0.4.1+1)
ReturnBeforeSuper.java:4: error: 'return' not allowed before explicit constructor invocation
1 error
$ javac broken/ReturnBeforeSuper.java (27+35)
ReturnBeforeSuper.java:4: error: 'return' not allowed before explicit constructor invocation
1 error
$ javac broken/SuperInBranch.java (25.0.4.1+1)
SuperInBranch.java:4: error: explicit constructor invocation not allowed here
SuperInBranch.java:4: error: explicit constructor invocation not allowed here
2 errors
$ javac broken/SuperInBranch.java (27+35)
SuperInBranch.java:4: error: explicit constructor invocation not allowed here
SuperInBranch.java:4: error: explicit constructor invocation not allowed here
2 errors
$ javac broken/TwoSuperCalls.java (25.0.4.1+1)
TwoSuperCalls.java:5: error: redundant explicit constructor invocation
1 error
$ javac broken/TwoSuperCalls.java (27+35)
TwoSuperCalls.java:5: error: redundant explicit constructor invocation
1 error
+19
View File
@@ -0,0 +1,19 @@
$ javac --release 21 broken/OnJdk21.java (25.0.4.1+1)
OnJdk21.java:7: error: flexible constructors is not supported in -source 21
super(name.strip());
^
(use -source 25 or higher to enable flexible constructors)
1 error
exit=1
$ javac --release 24 broken/OnJdk21.java (25.0.4.1+1)
OnJdk21.java:7: error: flexible constructors is not supported in -source 24
super(name.strip());
^
(use -source 25 or higher to enable flexible constructors)
1 error
exit=1
$ javac --release 25 broken/OnJdk21.java (25.0.4.1+1)
exit=0