Mudar Referência para Valor.
Você tem um objeto de referência pequeno demais e alterado com pouca frequência para justificar o gerenciamento de seu ciclo de vida.
Transforme-o em um objeto de valor.
##Exemplo
class Currency {
private String code;
// uma instância compartilhada por código, comparada com ==
}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 que refatorar
A inspiração para trocar uma referência por um valor pode vir do incômodo de trabalhar com a referência. Referências exigem gerenciamento da sua parte:
-
Elas sempre exigem solicitar o objeto necessário ao armazenamento.
-
Referências em memória podem ser inconvenientes de manipular.
-
Trabalhar com referências é particularmente difícil, em comparação com valores, em sistemas distribuídos e paralelos.
Valores são especialmente úteis se você prefere ter objetos imutáveis em vez de objetos cujo estado pode mudar ao longo de sua vida útil.
##Benefícios
-
Uma propriedade importante dos objetos é que eles devem ser imutáveis. O mesmo resultado deve ser obtido a cada consulta que retorna o valor de um objeto. Se isso for verdade, não surgem problemas quando há muitos objetos representando a mesma coisa.
-
Valores são muito mais fáceis de implementar.
##Como refatorar
-
Torne o objeto imutável. O objeto não deve ter setters nem outros métodos que alterem seu estado e seus dados (Remover Método de Atribuição pode ajudar aqui). O único lugar onde dados devem ser atribuídos aos campos de um objeto de valor é um construtor.
-
Crie um método de comparação para poder comparar dois valores.
-
Verifique se você pode excluir o método de fábrica e tornar público o construtor do objeto.