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

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

Если мы передадим два объекта String , система времени исполнения будет использовать версию, принимающую два параметра String . Если мы передадим аргументы другого типа (или один объект String ), система времени исполнения выдаст предупреждение о том, что не доступен конструктор, принимающий эти типы.

Вы можете перегрузить любой метод, не только конструкторы, что облегчает создание удобного интерфейса для пользователей ваших классов. Давайте попробуем добавить еще одну версию нашего метода addMoney() . Сейчас этот метод принимает один аргумент типа int . Это хорошо, но что если мы захотим добавить $100 в кошелек Adult ? Мы должны были бы вызвать метод столько раз, сколько необходимо для добавления конкретного набора банкнот, сумма которых составляет $100. Это очень неудобно. Было бы намного проще передать массив int , представляющий набор банкнот. Поэтому давайте перегрузим метод для приема параметра типа массив. Вот метод, который у нас уже имеется:

public void addMoney(int bill) {
	Integer boxedBill = new Integer(bill);
	wallet.add(boxedBill);		
}

Вот его перегруженная версия:

public void addMoney(int[] bills) {
	for (int i = 0; i < bills.length; i++) {
		int bill = bills[i];
		Integer boxedBill = new Integer(bill);
		wallet.add(boxedBill);			
	}
}

Этот метод очень похож на другой наш метод addMoney() , но он принимает массив в качестве параметра. Давайте попробуем использовать его, изменив наш метод main() следующим образом:

public static void main(String[] args) {
	Adult myAdult = new Adult();

	myAdult.addMoney(new int[] { 1, 5, 10 });
	System.out.println(myAdult);
}

После запуска кода на выполнение мы можем увидеть, что в кошельке нашего объекта Adult пока имеется $16. Это намного более удобный интерфейс. Видите ли вы какое-либо дублирование кода в наших двух методах? Две строки в первой версии являются копиями строк во второй версии. Если бы мы хотели изменить действия при добавлении денег, то должны были бы изменить код в двух местах, что не очень хорошо.

Если бы мы добавили еще одну версию метода, принимающую в качестве параметра ArrayList вместо массива, то должны были бы изменить код в трех местах. Это быстро стало бы неприемлемым. Вместо этого мы можем выполнить рефакторинг кода для устранения дублирования. В следующем разделе мы выполним рефакторинг под названием Extract Method для завершения работы.

Рейтинг
( Пока оценок нет )
Загрузка ...