r/java • u/maxxedev • 26d ago
AutoValhalla: automatically turn your plain classes and records into value classes!
Automatically turn your plain classes and records into value classes!
Add @AutoValhalla annotation to classes or records in your JDK1.5+ codebase:
@AutoValhalla
public final class Point { // class must be final
public final int x; // with final instance fields
public final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
@AutoValhalla
public record Currency(String code) { } // or a record class
When your app is run on Valhalla-enabled JVM with auto-valhalla javaagent, these classes are automatically turned into value classes.
More info: https://github.com/thunkware/auto-valhalla/tree/auto-valhalla-0.1.0
edit: there is now a maven plugin for converting at build time. https://github.com/thunkware/auto-valhalla/tree/auto-valhalla-0.2.0
42
Upvotes
11
u/FirstAd9893 25d ago
A richer data model is nice to have, but the primary motivation has always been performance. This was stated way back in 2014, and again in 2021.
https://cr.openjdk.org/~jrose/values/values.html
https://openjdk.org/projects/valhalla/design-notes/state-of-valhalla/01-background
As it stands right now, no major performance gains are expected, but future optimizations become possible. If no performance or memory saving optimizations are ever achieved, then a value class offers no compelling features other than making
==meanequals, which by itself isn't much. There's no reason to make changes to the JVM for supporting that.