Как Project Valhalla ще промени играта с type safety и performance
Как Project Valhalla прави type safety достъпна и без компромис с производителността
Ако сте работили с domain-driven дизайн в Java, вероятно сте се сблъсквали с този проблем. Искате да създадете PositiveInt, който да гарантира, че стойността никога няма да бъде отрицателна. Компилаторът да отхвърля невалидни състояния. Но когато стигнете до критичните пътища в кода, wrapper обектите се превръщат в пречка.
Защо wrapper класовете струват скъпо
Прост wrapper като PositiveInt заема 16 байта в паметта на HotSpot. Когато поставите милион такива обекти в масив, той не съхранява стойностите директно. Вместо това държи референции, които водят до допълнителни обекти в heap-а. Всяко достъпване изисква pointer dereference и увеличава риска от cache miss.
Резултатът е очевиден — wrapper-ът консумира четири пъти повече памет от примитивния тип, който защитава. Това принуждава разработчиците да валидират данните само на входа и да преминават към raw int или long във вътрешните цикли. Това е практическото правило от години.
Какво променя Project Valhalla
Java 27 Early Access въвежда value keyword. Value класовете нямат identity и JVM може да ги третира като примитиви. Те могат да бъдат вградени директно в масиви, полета на обекти или CPU регистри — без object header и без индирекция.
Създаването на PositiveInt изглежда почти същото:
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;
}
}
Валидацията остава, но JVM е свободен да вмъкне четирибайтовото int директно в структурата на паметта.