Logotipo de ConstructiCat
CodeBust.
Explorar la sección ▾

Autoencapsular Campo.

Problema

Usas acceso directo a campos privados dentro de una clase.

Solución

Crea un getter y un setter para el campo, y úsalos únicamente a ellos para acceder al campo.

##Ejemplo

Antes
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= low && arg <= high;
  }
}
Después
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= getLow() && arg <= getHigh();
  }
  int getLow() {
    return low;
  }
  int getHigh() {
    return high;
  }
}

##Por qué refactorizar

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.

##Ventajas

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

##Cómo refactorizar

  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.