ConstructiCat Logo
CodeBust.
Browse section ▾

Самоинкапсуляция поля.

Problem

Вы используете прямой доступ к приватным полями внутри класса.

Solution

Создайте геттер и сеттер для поля, и пользуйтесь для доступа к полю только ими.

##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

Бывает так, что вам перестаёт хватать гибкости с прямым доступом к приватному полю внутри класса. Вы хотите иметь возможность инициализировать значение поля при первом запросе или производить какие-то операции над новыми значениями поля в момент присваивания, либо делать все это разными способами в подклассах.

##Benefits

  • Непрямой доступ к полям — это когда работа с полем происходит через методы доступа (геттеры и сеттеры). Этот подход отличается гораздо большей гибкостью, чем прямой доступ к полям.

    • Во-первых, вы можете осуществлять сложные операции при получении или установке данных в поле. Ленивая инициализация, валидация значений в поле — все это легко реализуемо внутри геттеров и сеттеров поля.

    • Во-вторых, что ещё важнее, вы можете переопределять геттеры и сеттеры в подклассах.

  • Вы можете вообще не реализовывать сеттер для поля. Значение поля будет задаваться только в конструкторе, делая это поле неизменяемым для всего периода жизни объекта.

##How to Refactor

  1. Создайте геттер (и опциональный сеттер) для поля. Они должны быть защищёнными (protected) либо публичными (public).

  2. Найдите все прямые обращения к полю и замените их вызовами геттера и сеттера.