Руководство по actionscript. часть 1, стр. 088
Теперь добавим несколько статических переменных в наш класс VirtualPet. Как известно, статические переменные используются для хранения информации, которая логически относится ко всему классу и не меняется от одного экземпляра к другому. В нашем классе VirtualPet уже есть два примера подобной информации: максимальная длина имени животного и максимальное количество калорий, которое может принять данное животное. Для хранения этой информации добавим две новые статические переменные: maxNameLength и maxCalories. Мы не будем обращаться к нашим переменным за пределами класса VirtualPet, поэтому объявим их с использованием модификатора доступа private. Следующий код демонстрирует объявления переменных maxNameLength и maxCalories, при этом оставшаяся часть кода класса VirtualPet опущена ради краткости:
package zoo { internal class VirtualPet { private static var maxNameLength = 20; private static var maxCalories = 2000;
// Оставшаяся часть класса не показана…
}
}
Теперь, когда у нас есть переменные maxNameLength и maxCalories, мы можем модифицировать методы getHunger ( ), еаt ( ) и setName ( ), чтобы воспользоваться этими переменными. В листинге 4.1 продемонстрирована последняя версия класса VirtualPet, в который были добавлены статические переменные. Изменения, внесенные в предыдущую версию кода, выделены полужирным шрифтом. Обратите внимание, что по соглашению статические переменные класса перечислены перед переменными экземпляра.
/
Статические переменные
117
Листинг 4.1. Класс VirtualPet
package zoo { internal class VirtualPet { private static var maxNameLength = 20; private static var maxCalories = 2000;
private var petName;
// Изначально каждому животному дается 50 % от максимально
// возможного количества калорий.
private var currentCalories = VirtualPet. maxCalories/2;
public function VirtualPet (name) { setName(name):
}
public function eat (numberOfCalories) { var newCurrentCalories = currentCalories + numberOfCalories; if (newCurrentCalories > VirtualPet. maxCalories) {
currentCalories = Virtual Pet. maxCalories; } else {
currentCalories = newCurrentCalories;
}
}
public function getHunger ( ) { return currentCalories / Virtual Pet. maxCalories;
}
public function setName (newName) { // Если длина заданного нового имени больше maxNameLength символов… if (newName. length > Virtual Pet. maxNameLength) { // …обрезать имя
newName = newName. substr(0. VirtualPet. maxNameLength); } else if (newName == «») { // …в противном случае, если заданное новое имя является // пустой строкой, завершить выполнение метода, не изменяя // значения переменной petName return;
}
// Присвоить новое проверенное имя переменной petName petName = newName;
}
public function getName ( ) { return petName;
}
}
Если проанализировать листинг 4.1, то можно заметить, что наличие переменных maxNameLength и maxCalories помогает централизовать код. Например,
ранее, чтобы изменить максимально допустимое количество символов в имени, нам пришлось бы заменить число 20 в двух местах тела метода setName — этот процесс не только отнимает много времени, но и может привести к ошибке. Теперь, чтобы изменить максимально допустимое количество символов, нужно просто присвоить другое значение переменной maxNameLength, и весь класс обновится автоматически.