6.2.1 Геттеры и сеттеры

Метод, присваивающий значения полям объекта, называется сеттер (setter, от английского to set – установить, назначить). Согласно правилам именования Java этот метод должен иметь имя set <свойство> (). Метод, возвращающий значения полей объекта, называется геттер (getter, от английского to get – взять, получить). Этот метод должен иметь имя get <свойство> (). Впрочем, указывать имя свойства не обязательно, о чем говорят угловые скобки.

Геттеры и сеттеры – это стандартные термины программирования на языке Java. Использование геттеров и сеттеров является более безопасным, чем прямое обращение к переменным объекта, поскольку не позволяет менять значения случайно. При использовании сеттера значения полей будут изменены только при вызове метода set (), и только способом, который описан в этом методе.


6.2.2 Перегрузка методов

Язык Java позволяет описывать несколько методов с одинаковыми именами в одном и том же классе. Одноименные методы различаются типом и/или количеством аргументов. Такой подход называется перегрузкой методов и позволяет создавать эффективный и гибкий программный код.

Что происходит, когда мы вызываем метод с одним и тем же именем, но с разными аргументами? На самом деле в программе создаются разные методы, обозначенные одним именем. При вызове метода по имени программа определяет, какой из методов «подходит» для выполнения, исходя из количества и типа переданных аргументов. Для пользователя это выглядит так, будто вызываются разные версии одного метода.

В листинге 6.4 приведен пример использования перегрузки методов для присваивания значений полям объекта.


Листинг 6.4 Пример использования перегрузки методов

// Объявляем собственный класс

class MyClass {

// Объявляем поля класса

int digit;

char letter;

// Метод с одним числовым аргументом

void set (int n) {

digit=n;

}

// Метод с одним символьным аргументом

void set (char s) {

letter=s;

}

// Метод с двумя аргументами

void set (int n, char s) {

set (n); //Присвоить значение полю digit

set (s); //Присвоить значение полю letter

}

// Метод без аргументов

void set () {

// Присваиваем значение 5 полю digit

// и значение А полю letter

set (5, «A»);

}

// Метод для отображения значений полей

void show () {

System.out.println («Поле digit: "+digit);

System.out.println («Поле letter: "+letter);

}

}


public class Listing6_4 {

public static void main (String [] args) {

// Объявляем первый объект класса MyClass

MyClass objFirst=new MyClass ();

// Объявляем второй объект класса MyClass

MyClass objSecond=new MyClass ();

// Присваиваем числовое значение полю

// первого объекта

objFirst.set (10);

// Присваиваем символьное значение полю

// первого объекта

objFirst.set («F»);

// Присваиваем значения по умолчанию полям

// второго объекта

objSecond.set ();

// Выводим на печать значения полей первого объекта

System.out.println («Свойства первого объекта»);

objFirst.show ();

// Выводим на печать значения полей второго объекта

System.out.println (»\nСвойства второго объекта»);

objSecond.show ();

}

}

В этом примере мы описали метод с именем set () для присвоения значений полям объекта. Напомним, что такой метод принято называть «сеттер». Если в качестве аргумента сеттеру передано целое число, то он присваивает значение числовому полю. Если передано символьное значение, то оно присваивается символьному полю. Наконец, если переданы оба значения, то они присваиваются обоим полям в соответствии с их типом.

Обратите внимание, как реализована обработка вызова сеттера без аргументов. Мы захотели, чтобы в этом случае полям были присвоены значения по умолчанию: целочисленное 5 и символьное «A». Поэтому внутри сеттера без аргументов вызывается сеттер с двумя аргументами. В свою очередь, внутри сеттера для двух аргументов поочередно вызываются сеттеры для целочисленного аргумента и символьного аргумента. Со стороны это выглядит так, словно метод несколько раз вызывает сам себя. Но вы уже знаете, что на самом деле это разные методы с одинаковым именем. Допустимость таких конструкций – достоинство языка Java, позволяющее писать мощный и легко читаемый код. В нашем примере вложенная структура вызовов выглядит излишней, потому что мы используем очень простые методы – казалось бы, проще присвоить значения полям непосредственно в вызванном сеттере. Но в реальном программировании, когда каждый метод состоит из сотен строк кода, намного выгоднее вызвать уже описанный и отлаженный метод внутри другого метода, чем дублировать описание.