ConstructiCat Logo
CodeBust.
Browse section ▾

Autoencapsular Campo.

Problem

Você usa acesso direto a campos privados dentro de uma classe.

Solution

Crie um getter e um setter para o campo e use apenas eles para acessar o campo.

##Example

Before
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= low && arg <= high;
  }
}
After
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= getLow() && arg <= getHigh();
  }
  int getLow() {
    return low;
  }
  int getHigh() {
    return high;
  }
}

##Why Refactor

Às vezes, acessar diretamente um campo privado dentro de uma classe simplesmente não é flexível o suficiente. Você quer poder inicializar o valor de um campo na primeira vez que ele é consultado, ou realizar certas operações sobre os novos valores do campo quando são atribuídos, ou talvez fazer tudo isso de maneiras diferentes em subclasses.

##Benefits

  • O acesso indireto a campos ocorre quando um campo é manipulado por meio de métodos de acesso (getters e setters). Essa abordagem é muito mais flexível do que o acesso direto a campos.

    • Primeiro, você pode realizar operações complexas quando os dados do campo são definidos ou obtidos. A inicialização tardia (lazy initialization) e a validação dos valores do campo são facilmente implementadas dentro dos getters e setters do campo.

    • Segundo, e mais importante, você pode redefinir getters e setters em subclasses.

  • Você tem a opção de não implementar nenhum setter para um campo. O valor do campo será especificado apenas no construtor, tornando o campo imutável durante toda a vida do objeto.

##How to Refactor

  1. Crie um getter (e, opcionalmente, um setter) para o campo. Eles devem ser protected ou public.

  2. Encontre todas as invocações diretas do campo e substitua-as por chamadas ao getter e ao setter.