Вызов перегруженных конструкторов через this ()

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

this(arg-list)

Когда выполняется this (), сначала выполняется перегруженный конструктор, который соответствует списку параметров arg-list. Затем выполняются операторы, находящиеся внутри исходного конструктора, если таковые присутствуют. Вызов this () должен быть первым оператором в конструкторе.

Чтобы понять, как следует использовать this (), рассмотрим короткий пример. Для начала приведем класс, который не использует this ():

class MyClass {
int а;
int b;
// Инициализировать а и b индивидуально
MyClass(int i, int j) {
a = i;
b = j;
}
// Инициализировать а и b одним и тем же значением
MyClass(int i) {
a = i;
b = i;
}
// Присвоить а и b значение по умолчанию 0
MyClass( ) {
a = 0;
b = 0;
}
}

Этот класс включает в себя три конструктора, каждый из которых инициализирует значения а и Ь. Первому передаются индивидуальные значения для а и Ь. Второй принимает только одно значение и присваивает его и а, и Ь. Третий присваивает а и b значение по умолчанию — 0.

Используя this (), можно переписать приведенный MyClass следующим образом:

class MyClass {
int а;
int b;
// Инициализировать а и b индивидуально
MyClass(int i, int j) {
a = i;
b = j;
}
// Инициализировать а и b одним и тем же значением
MyClass(int i) {
this(i, i); // вызывается
MyClass(i, i) ;
}
// Присвоить а и b значение по умолчанию 0
MyClass( ) {
this(0); // вызывается
MyClass(0)
}
}

В этой версии MyClass единственным конструктором, который в действительности присваивает значения полям а и b, является MyClass (int, int). Например, посмотрим, что случится при выполнении следующего оператора:

MyClass mc = new MyClass(8);

Вызов MyClass (8) заставляет выполниться this (8, 8), что транслируется в вызов MyClass (8,8), поскольку именно эта версия конструктора MyClass соответствует данному вызову this () по списку параметров. Теперь рассмотрим следующий оператор, использующий конструктор по умолчанию:

MyClass mc2 = new MyClass О ;

В этом случае вызывается this (0). Это заставляет выполниться MyClass (0), поскольку именно эта версия конструктора подходит по списку параметров. Конечно же, MyClass (0) затем обращается к MyClass (0,0), как только что было описано.

Одной из причин, по которым стоит вызывать перегруженные конструкторы через this (), является исключение дублирования кода. Во многих случаях сокращение дублированного кода сокращает время загрузки ваших классов, поскольку код объекта уменьшается. Это особенно важно для программ, доставляемых по Internet, когда время загрузки критично. Применение this () может также помочь структурировать ваш код, когда конструкторы содержат большой объем дублированного кода.