Valhalla: Type-sikkerhet og fart i samme pakkesendelse
Domain-Driven Type Safety Meets Performance: How Project Valhalla Changes Everything
Hvis du har jobbet med domene-drevet arkitektur i Java, vet du hvor det skår. Du vil lage en PositiveInt som aldri kan være negativ. Kompileren skal avvise ugyldige verdier. Sikkerhet er målet.
Men så kommer den kritiske løkken. En prosessor som håndterer millioner av hendelser, der hver sekvensnummer er en PositiveInt. Da blir de type-sikre wrapper-objektene en ulempe—16 byte overhead per verdi, millioner av heap-allokeringer, cache-problemer. Regelen har vært enkel: valider ved grensen, dropp typene før du treffer ytelseskritisk kode.
Project Valhalla endrer denne regelen.
Det gamle problemet: overhead fra wrappers
En enkel wrapper som PositiveInt som inneholder én int tar 16 byte på HotSpot—12 byte objekt-header pluss 4 byte for selve verdien. Når du putter en million av disse i et array, lagrer arrayet ikke verdiene direkte. Det lagrer referanser. Hver tilgang krever en peker-avreferering, med risiko for cache-miss.
Det blir fort dyrt: wrapperen bruker fire ganger så mye minne som primitiven den beskytter. Tilfeldige tilgangsmønstre forsterker problemet—hver gang du trenger verdien, må du hoppe til en ny minneplassering og forstyrre CPU-cachen.
Dette har skapt en arkitektonisk begrensning. Domenetyper fungerer fint ved API-grenser der du validerer input og etablerer invarianter. Men når data flyter gjennom en hot loop—strømmer, samlinger, numeriske algoritmer—måtte du konvertere tilbake til rå int eller long og miste sikkerheten.
摩擦en var real. Løsningen var ufullstendig.
Value classes: type-sikkerhet uten straff
Project Valhalla er nå tilgjengelig i Java 27 Early Access. Det introduserer value-nøkkelordet. Med regular classes må JVM allokere på heapen og traktere identity. Med value classes er de identity-free. JVMen behandler de som primitives—de kan flatte dem ut i minne hvor de appears: inline in arrays, embedded in object fields, packed in CPU registers.
Så er i dette formatet:
public value class PositiveInt {
private final int value;
public PositiveInt(int value) {
if (value <= 0) {
throw new IllegalArgumentException("must be positive: " + value);
}
this.value = value;
}
public int value() {
return value;
}
}
Syntaxen er almost identisk til en regular class. Constructor kjører. Validering kjører. Typen er garanti: anywhere du ser en PositiveInt, du know verdien er positive.
T<|eos|>