Un Value Object es un objeto que representa un valor y no tiene identidad. Lo único que importa es su valor, dos Value Objects son iguales si sus valores son iguales.
Una característica importante es que son objetos inmutables, no se pueden modificar. La única forma válida de crear Value Objects es pasar toda la información requerida al constructor y validando dicha información en algún método interno.
Los Value Objects son objetos pequeños y simples, útiles para representar conceptos como cantidades de dinero, rangos de fechas, o coordenadas geográficas, donde los valores encapsulados son lo que realmente importan.
Este patrón es ideal cuando se necesita modelar y trabajar con conceptos o valores que no requieren identidad persistente o seguimiento de cambios en el estado del objeto.
Es útil para:
public final class Dinero {
private final BigDecimal cantidad;
private final String moneda;
public Dinero(BigDecimal cantidad, String moneda) {
this.cantidad = cantidad;
this.moneda = moneda;
}
public Dinero sumar(Dinero otro) {
if (!this.moneda.equals(otro.moneda)) {
throw new IllegalArgumentException("No se pueden sumar cantidades de diferentes monedas.");
}
return new Dinero(this.cantidad.add(otro.cantidad), this.moneda);
}
// Getters y otros métodos, sin setters para mantener la inmutabilidad
}
El patrón Value Object se usa para representar conceptos de dominio de manera eficiente, segura y clara, objetos pequeños y simples.
Al enfocarse en el valor, más que en su identidad, ayuda a simplificar la lógica de negocio y mejora la claridad del código.
Los Value Objects facilitan el diseño y la implementación de operaciones de negocio complejas de una manera más intuitiva y segura.