Un Value Object es un pequeño objeto que representa una cantidad simple, como una suma de dinero, una fecha o un rango de celdas. Su identidad se basa en su valor en lugar de en una identidad única.
Lo que define a un Value Object es que dos instancias son consideradas iguales si tienen el mismo valor, independientemente de si son el mismo objeto en memoria.
# ¿Cuándo usarlo?
Es ideal para representar conceptos del dominio que no requieren una identidad persistente pero que agrupan atributos relacionados que siempre van juntos (como una Dirección o un Importe).
# Ventajas
-
verified
Inmutabilidad
Generalmente son inmutables, lo que previene efectos secundarios indeseados.
-
verified
Claridad semántica
Aporta significado al código al agrupar datos relacionados bajo un nombre descriptivo.
-
verified
Facilidad de pruebas
Al ser inmutables y no tener dependencias, son muy fáciles de probar.
# Desventajas
-
warning
Sobrecarga de memoria
La creación de muchos objetos pequeños puede impactar ligeramente en el rendimiento en casos extremos.
-
warning
Dificultad en ORMs
Algunos mapeadores objeto-relacional pueden requerir configuración extra para manejarlos.
# Ejemplo Detallado en Java
Un ejemplo clásico de un Value Object para representar una Moneda:
Dinero.java
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 BigDecimal getCantidad() { return cantidad; }
public String getMoneda() { return moneda; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Dinero)) return false;
Dinero dinero = (Dinero) o;
return Objects.equals(cantidad, dinero.cantidad) &&
Objects.equals(moneda, dinero.moneda);
}
@Override
public int hashCode() {
return Objects.hash(cantidad, moneda);
}
}
# Conclusiones
El patrón Value Object simplifica la lógica de negocio al tratar a los objetos pequeños como valores inmutables en lugar de entidades con ciclos de vida complejos. Esto mejora la robustez y mantenibilidad del sistema.