ConstructiCat Logo
CodeBust.
Browse section ▾

Autoencapsular Campo.

Problem

Usas acceso directo a campos privados dentro de una clase.

Solution

Crea un getter y un setter para el campo, y úsalos únicamente a ellos para acceder al 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

A veces, acceder directamente a un campo privado dentro de una clase simplemente no es lo bastante flexible. Quieres poder iniciar el valor de un campo cuando se hace la primera consulta, o realizar determinadas operaciones sobre los nuevos valores del campo cuando se asignan, o quizá hacer todo esto de diversas maneras en las subclases.

##Benefits

  • El acceso indirecto a los campos es cuando se actúa sobre un campo a través de métodos de acceso (getters y setters). Este enfoque es mucho más flexible que el acceso directo a los campos.

    • Primero, puedes realizar operaciones complejas cuando los datos del campo se asignan o se reciben. La inicialización perezosa y la validación de los valores del campo se implementan fácilmente dentro de los getters y setters del campo.

    • Segundo y más crucial, puedes redefinir los getters y setters en las subclases.

  • Tienes la opción de no implementar ningún setter para un campo. El valor del campo se especificará solo en el constructor, haciendo así que el campo sea inmutable durante toda la vida del objeto.

##How to Refactor

  1. Crea un getter (y, opcionalmente, un setter) para el campo. Deberían ser protected o public.

  2. Encuentra todas las invocaciones directas del campo y reemplázalas con llamadas al getter y al setter.