Puede ser muy práctico para nuestro código, no pensar en un valor propiamente dicho, sino en un wrapper que nos de más flexibilidad. Por ejemplo, en la aplicación que estamos trabajando se utiliza pesos pero en vez de modelarlo como un Double, utilizo un wrapper (que va ser una clase valor o value class) de esta forma no penalizo la performance (ya van a ver porque digo esto) y si en el futuro desean trabajar con otras monedas, dolares, por ejemplo me va a costar mucho menos el cambio gracias a este wrapper.
Value Class son un mecanismo en Scala que ayuda a evitar la asignación de objetos en tiempo de ejecución. Esto se logra a través de la definición de nuevas subclases de AnyVal. A continuación se muestra una definición de clase de valor muy mínima:
case class UserId(val id: Int) extends AnyVal
Como puede ver una clase de valor, debe tener exactamente un parámetro y no tener nada dentro, excepto defs. Además, ninguna otra clase puede extender una clase de valor, y una clase de valor no puede redefinir equals o hashCode.
Fundamentalmente, una clase de valor es aquella que se ajusta a un tipo muy simple o un valor simple, como Int, Boolean, etc. Lo que eso significa es que, en el momento de la compilación, ve la clase de valor y usa la clase de valor, pero se genera un byte code, que en realidad está utilizando el tipo simple. Entonces, eso aumentan el rendimiento y crean menos uso de memoria, porque no hay una instancia de las clases contenedoras.
Las clases de valor se utilizan principalmente para la optimización del rendimiento y la optimización de la memoria. Puede pensar en muchas de estas clases como su primitiva típica de Scala, como las clases Int, Boolean, Double, etc. Los casos de uso en los que desearía y donde podría aplicar clases de valor son para tipos pequeños.