Самоинкапсуляция поля.
Вы используете прямой доступ к приватным полями внутри класса.
Создайте геттер и сеттер для поля, и пользуйтесь для доступа к полю только ими.
##Example
class Range {
private int low, high;
boolean includes(int arg) {
return arg >= low && arg <= high;
}
}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
-
Создайте геттер (и опциональный сеттер) для поля. Они должны быть защищёнными (
protected) либо публичными (public). -
Найдите все прямые обращения к полю и замените их вызовами геттера и сеттера.