Геттеры и сеттеры.

20-01-2020

Для того чтобы разрешить другому классу прочитать значение private переменной, например, xxx, следует использовать метод, называемый геттером (от англ. get – получать), обычно имеющий имя getXxx(). Геттер-метод не должен отображать информацию, он может обрабатывать данные и ограничивать видимость данных. Геттеры не изменяют переменную. Чтобы разрешить другим классам модифицировать переменную, например, xxx, следует создать метод сеттер (от англ. set – устанавливать) и назвать его setXxx(). Сеттер может провести проверку данных и преобразовать исходные данные во внутреннее представление. Например, в нашем классе Circle переменные radius и color объявлены как private. Это означает, что они доступны только внутри класса Circle и не видны в других классах, включая TestCircle класс. У вас нет доступа к private-переменным radius и color из класса TestCircle напрямую, т.е., скажем, через c1.radius или c1.color. Класс Circle предоставляет два метода с доступом public, а именно getRadius() и getColor(). Класс TestCircle может вызывать эти методы с доступом public для извлечения значений полей radius и сolor Circle-объекта.

Нельзя изменить radius или сolor объекта Circle после того, как он сконструирован в классе TestCircle без использования сеттера. Вы не можете использоватьтакие предложения,как c1.radius=5.0,для изменения поля radius объекта c1, так как поле radius объявлено как private в классе Circle и не видно в других классах, включая TestCircle.

Если разработчик класса Circle разрешит изменять поля radius или color после того, как объект класса Circle уже создан, он должен предоставить соответствующий сеттер, например:

//сеттер для Color

public void setColor(String c) {
  color=c;
}

//сеттер для Radius

public void setRadius(double r) {
  radius=r;
}

Имея соответствующую реализацию сокрытия информации, разработчик класса имеет полный контроль того, что пользователь класса может и чего не может делать.

Ключевое слово “this”

Ключевое слово “this” используется для ссылки на данный объект внутри описания класса. В основном ключевое слово “this” используется для того, чтобы избежать двойного толкования.

public class Circle {
  double radius; //Поле класса с именем "radius"
  public Circle(double radius){ //Параметр метода также с именем "radius"
    this.radius=radius;
    //this.radius - ссылка на поле this данного объекта
    //radius - подразумевает параметр метода
  }
}

В приведенном фрагменте кода есть два идентификатора с именем radius – переменная-член класса (поле) и параметр метода. Это вызывает конфликт имен. Чтобы избежать конфликта имен, можно было бы назвать параметр метода r вместо radius. Однако имя radius является более содержательным и близким по контексту. Java предоставляет ключевое слово “this” для разрешения конфликта имен. Так, “this.radius” отсылает к переменной-члену класса, т.е. к полю, в то время как “radius” предполагает параметр метода.

Рассмотрим в общем виде использование ключевого слова “this” в конструкторе, сеттере и геттере для private поля с именем xxx типа T:

public class Aaa {
  //переменная с именем xxx типа Т:
  private T xxx;

  //конструктор
  public Aaa(T xxx) {
    this.xxx=xxx;
  }
  //геттер для поля ххх типа Т не имеет параметров и возвращает значение типа Т
  public T getXxx(){
    return xxx;
  }
  //сеттер для поля ххх типа Т получает параметр типа Т и возвращает void
  public void setXxx(T xxx){
    this.xxx=xxx;
  }
}

Для переменной типа boolean геттер рекомендуется называть isXxx() вместо getXxx():

//Private переменная типа Boolean
private boolean xxx;

//Getter
public boolean isXxx(){
  return xxx;
}

//Setter
public void setXxx(boolean xxx) {
  this.xxx=xxx;
}

Замечания:

  • this.имяПеременной – ссылка на поле имяПеременной этого объекта;
  • this.имяМетода(…) – вызывает метод имяМетода (…) данного объекта.
  • В конструкторе можно использовать this(…) для вызова другого конструктора этого класса.
  • Внутри метода можно использовать предложение “return this” для возврата этого объекта при вызове.

Метод toString()

Каждый хорошо разработанный Java класс должен иметь publicметод с именем toString(), который возвращает текстовое описание объекта. Метод toString можно явно или неявно вызвать следующим образом:

  • имяОбъекта.toString();
  • через println;
  • через конкатенацию строк, т.е. оператор ‘+’.

Выполнение println(имяОбъекта) с объектом в качестве аргумента неявно вызывает метод toString() для этого объекта.

Константы (final)

Константа – это именованная область памяти, определенная однажды и не имеющая возможности измениться. Константы определяются посредством модификатора final. Во время объявления константу надо проинициализировать. Например:

public final double MY_CONST=10.9876;

Соглашение об именах: Имя константы – это существительное или фраза, состоящая из нескольких существительных. Все слова записываются заглавными буквами и разделяются знаком подчеркивания ‘_’, например, X_REFERENCE, MAX_INTEGER и MIN_VALUE.

Замечания:

  1. Константе базового типа нельзя присвоить новое значение.
  2. Константному объекту не может быть присвоен новый адрес.
  3. Константный класс не может быть подклассом (extended).
  4. Константный метод не может быть переопределен.

Литература

  1. О.И. Гуськова, "ООП в Java", Москва, 2018