Banning constructors in value classes (JDK-8198749)

Srikanth srikanth.adayapalam at
Tue Feb 27 13:29:35 UTC 2018

There has been some discussion about banning <init> methods in value 
classes - with tentative semantics being discussed for invokespecial to 
throw an exception if it encounters an <init> method in a value class.


Already, any attempt to create a value class instance via the new 
operator is forbidden by javac and neither __MakeDefault not withfield 
operation make use of the constructors. So any constructors are dead 
code and it makes sense at the outset to get rid of them.

I prototyped this in javac and this is what this means:

     - All instance fields of value classes must be blank final 
variables. No initialization can be allowed.
(With <init> methods going away, there is no place to stick these 
     - For the same reason, there cannot be instance initializer blocks 
in a value class.
      - Value classes may not declare any constructors
      - The compiler may generate a default constructor to simplify its 
life, but such a generated constructor will not make it to the class file.
     - For value classes, the compiler will relax the requirement that 
all blank final instance variables must be initialized before any 
constructor finishes - there are no constructors, so this cannot/need 
not be/will not be enforced.

I am still testing this prototype, but at the moment I am not aware of 
any problems, but a question: I imagine it should be possible to invoke 
j.l.O methods on a value instance and have them be routed to j.l.O 
implementation or to the override - will this work without constructor 
chaining - (No such chaining is happening anyways already)

Frederic/John, is this something you want to see pushed to the branch ? 
(assuming further testing does not uncover any problems) Or should this 
wait ?


More information about the valhalla-dev mailing list