Logotipo do ConstructiCat
CodeBust.
Explorar a seção ▾

Mudar Referência para Valor.

Problema

Você tem um objeto de referência pequeno demais e alterado com pouca frequência para justificar o gerenciamento de seu ciclo de vida.

Solução

Transforme-o em um objeto de valor.

##Exemplo

Antes
class Currency {
  private String code;

  // uma instância compartilhada por código, comparada com ==
}
Depois
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

  1. 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.

  2. Crie um método de comparação para poder comparar dois valores.

  3. Verifique se você pode excluir o método de fábrica e tornar público o construtor do objeto.