Speaker: Dan Smith
See the table of contents for more posts
General
- Dictionary says initializing is to set something to a starting position/value/configuration
- Dangerous things happen if don’t satisfy invariants
- Initialize – local variables, fields, arrays, classes, class instances, specific objects, components, modules, frameworks, systems
Variables
- Well behaved variable always initialized before used
- If final, only one initialization
- Local variables checked at compile time
- Whether the default value is an initial value depends on programmer intent
- Final fields are good because must be initialized/can’t be mutated. However don’t prevent reading before initialization. (via constructor calling a method)
Class initialization state
- Uninitialized – init hasn’t started yet, class can’t be used
- Larval – init code running in specific thread; other threads block. Can see default values or final values changing. Can see accidental state
- Initialized – init completed, class can be used
- Erroneous – init threw exception. Class may never be used
Instance initialization
- Some code runs early in construction like passing things to another constructor
- Other code runs later like instance initializers or constructor bodies
JEP 492 – Flexible constructor bodies
- Allows more code to run in early phase.
- Can have lines of code before this/super call
- Larval state now split into early and late larval
- Early larval – constructor code is running up the hierarchy
- Late larval – nrolling down the hierarchy. starting from when Object superclass initialized
- In early larval, can’t use this or invoke instance methods
- In late larval, be careful. this can be shared; field may change value, final fields may change
- Instance initializers considered early larval
- Array creation expressions produced an initialized array. Programmers don’t see a larval state.
Why change?
- Initialization bugs are subtle and hard to see
- Value classes must initialize fields before sharing larval object so JVM can freely make copies
- Allows null checked variables to ensure cannot be null so can’t have a default value
Future
- Want to change the timing so field initializers and implicit super() run in early phase.
My take
It was like getting a pick behind the scenes. I also learned that larval is a state. (said in Q&A that concept exists now for classes but doesn’t use term. And for instances the concept is there but don’t use the term state) The beginning was slow and I was worried I would be bored. But it got better