Cambiar referencia por valor.
Tienes un objeto de referencia demasiado pequeño y que cambia con poca frecuencia como para justificar la gestión de su ciclo de vida.
Conviértelo en un objeto de valor.
##Ejemplo
class Currency {
private String code;
// una instancia compartida por código, se compara con ==
}class Currency {
private final String code;
Currency(String code) {
this.code = code;
}
@Override
public boolean equals(Object other) {
return other instanceof Currency
&& code.equals(((Currency) other).code);
}
@Override
public int hashCode() {
return code.hashCode();
}
}##Por qué refactorizar
La motivación para pasar de una referencia a un valor puede surgir de la incomodidad de trabajar con la referencia. Las referencias requieren gestión por tu parte:
-
Siempre requieren solicitar el objeto necesario al almacenamiento.
-
Las referencias en memoria pueden resultar incómodas de manejar.
-
Trabajar con referencias es especialmente difícil, en comparación con los valores, en sistemas distribuidos y paralelos.
Los valores son especialmente útiles si prefieres tener objetos inmutables en lugar de objetos cuyo estado puede cambiar durante su vida útil.
##Ventajas
-
Una propiedad importante de los objetos es que deberían ser inmutables. El mismo resultado debería obtenerse en cada consulta que devuelva el valor de un objeto. Si esto se cumple, no surge ningún problema aunque haya muchos objetos que representen la misma cosa.
-
Los valores son mucho más fáciles de implementar.
##Cómo refactorizar
-
Haz que el objeto sea inmutable. El objeto no debería tener setters ni ningún otro método que cambie su estado y sus datos (Eliminar método de asignación puede ayudar aquí). El único lugar donde deberían asignarse datos a los campos de un objeto de valor es un constructor.
-
Crea un método de comparación para poder comparar dos valores.
-
Comprueba si puedes eliminar el método de fábrica y hacer público el constructor del objeto.