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:
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user