Статические методы ActionScript 

 

 

В предыдущем разделе мы узнали, что статические переменные используются 

для хранения информации, которая относится ко всему классу. Подобным  

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

классу, а не к отдельному экземпляру этого класса. Например, в состав API среды 

выполнения Flash входит класс Point, представляющий точку с координатами по 

оси X и по оси Y в декартовой системе координат. В классе Point определен  

статический метод polar ( ), который позволяет получить объект Point по заданной 

точке в полярной системе координат (то есть по расстоянию и углу).  

Преобразование точки в полярной системе координат в точку в декартовой системе координат 

является общей операцией, относящейся к точкам в декартовом пространстве  

вообще, а не к отдельному объекту Point. Именно поэтому данный метод определен 

как статический. 

Как и методы экземпляра, статические методы создаются описанием функций  
внутри описаний классов, однако описания статических методов должны также  
включать атрибут static, как показано в следующем обобщенном коде: 
class HeкийКласс { 
static function имяМетода (идентификатор! = значение1, 
идентификатор = значение2, 
идентификатор!! = значениеп) { 
Как и в случае с методами экземпляра, управлять доступностью статических  
методов в программе можно с помощью модификаторов управления доступом. В  
описаниях статических методов применяются те же модификаторы управления доступом, 
что и в описаниях методов экземпляра: public, internal, protected и private. 
Если при описании метода не указан никакой модификатор доступа, то  
используется модификатор internal (доступ внутри пакета). При описании статического 
метода модификатор доступа обычно размещается перед атрибутом static, как 
показано в следующем обобщенном коде: 
class НекийКласс { 
public static function имяМетода (идентификатор! = значение1, 
идентификатор2 = значение2 
идентификаторп = значениеп) { 
Для вызова статического метода используется следующий обобщенный код: 
НекийКласс.имяМетода(значение1, значение2...значениеп) 
В предыдущем коде НекийКласс обозначает класс, в котором определен статический 
метод, имяМетода — это имя статического метода, а значение1, значение2. . .  
значениеп — список, состоящий из нуля или более аргументов метода. Внутри класса, в  
котором определен данный метод, имя имяМетода может быть использовано  
самостоятельно (без лидирующего имени класса и точки). Например, в классе А, в котором 
определен статический метод т, выражение А.т ( ) идентично выражению m ( ). 
Тем не менее, чтобы различать статические методы и методы экземпляра, многие 
разработчики (это относится и к примерам данной книги) включают лидирующее 
имя класса даже в тех случаях, когда его использование не является обязательным. 
Некоторые классы существуют только ради определения статических методов, 
объединяя связанную функциональность, однако экземпляры таких классов  
никогда не создаются. Например, собственный класс Mouse существует только ради 
определения статических методов show ( ) и hide ( ) (используются для  
отображения или скрытия указателя мыши). Обращение к этим статическим методам  
происходит непосредственно через класс Mouse (как, например, Mouse. hide ( ) ), а не 
через экземпляр данного класса. Объекты класса Mouse никогда не создаются. 
У статических методов есть два ограничения, которые отсутствуют у методов  
экземпляра. Во-первых, в методе класса нельзя использовать ключевое слово this. 
Во-вторых, статический метод не может обращаться к переменным и методам  
экземпляра класса, в котором он определен (в отличие от методов экземпляра,  
которые, помимо переменных и других методов экземпляра, могут также обращаться 
к статическим переменным и статическим методам). 
В целом, статические методы по сравнению со статическими переменными  
используются не часто. В нашей программе по созданию виртуального зоопарка 
статические методы не применяются вообще. Чтобы продемонстрировать  
применение статических методов на практике, вернемся к функции проверки адресов 
электронной почты, описанной в гл. 2. В этой функции мы создали цикл, который 
позволяет определить наличие или отсутствие символа @ в указанном адресе  
электронной почты. Теперь представим, что в результате активного развития нашего 
приложения было решено создать служебный класс для работы со строками.  
Назовем его StringUtils. Класс StringUtils не будет использоваться для создания 
объектов; он просто представляет коллекцию статических методов. В качестве 
примера мы определим один статический метод contains ( ), возвращающий 
значение типа Boolean — это значение определяет, содержит ли указанная строка 
выбранный символ. Рассмотрим код: 
public class StringUtils { 
public function contains (string, character) { 
for (var i:int = 0; i <= string.length; i++) { 
if (string.charAt(i) == character) { 
return true; 
return false; 
В следующем примере кода показано, как наше приложение могло бы использовать 
метод contains ( ), чтобы проверить, содержит ли указанный адрес электронной 
почты символ @: 
StringLIti I s.contains("me@moock.org", "@"); 
Конечно, в реальном приложении адрес электронной почты вводил бы сам  
пользователь и метод contains ( ) определял бы допустимость отправки формы на 
сервер. Следующий код демонстрирует более реалистичную ситуацию: 
if (StringUtils.contains(userEmail, "@")) { 
// Этот код отправлял бы форму на сервер 
} else { 
// Этот код отображал бы сообщение "Неправильные данные" для пользователя 
Помимо статических методов, которые создаются вручную, среда выполнения Flash 
автоматически создает для каждого класса один статический метод, называемый 
инициализатором класса. Познакомимся с ним поближе. 
Инициализатор класса. После определения класса на этапе выполнения  
программы среда Flash автоматически создает и исполняет метод, называемый  
инициализатором класса. В нем среда Flash размещает все инициализаторы статических 
переменных данного класса и весь код уровня класса, не относящийся к описаниям 
переменных или методов. 
Инициализатор класса предоставляет возможность выполнять однократные задачи 
настройки сразу после определения класса, вызывая методы или обращаясь к  
переменным, являющимся внешними по отношению к текущему классу. Предположим, 
что мы создаем приложение для чтения электронной почты и хотим, чтобы внешний 
вид этого приложения соответствовал графическому стилю операционной системы. 
Чтобы определить, какая графическая тема должна быть использована в почтовом 
клиенте, в инициализаторе основного класса приложения MailReader проверяется 
текущая операционная система и присваивается соответствующее значение  
статической переменной theme. Переменная theme хранит информацию о графической 
теме, используемой в данном приложении. В следующем коде  
продемонстрирован инициализатор для класса MailReader. Для проверки операционной  
системы в классе MailReader используется статическая переменная os, определенная 
в собственном классе flash, system. Capabilities. 
package { 
import flash.system.*; 
public class MailReader { 
static var theme; 
if (Capabilities.os == "MacOS") { 
theme = "MAC"; 
} else if (Capabilities.os == "Linux") { 
theme = "LINUX"; 
} else { 
theme = "WINDOWS"; 
Код, размещаемый в инициализаторе класса, выполняется в режиме  
интерпретации, и JIT-компилятор не компилирует его. Динамически откомпилированный 
код выполняется гораздо быстрее интерпретируемого кода, поэтому в тех  
случаях, когда на первом месте стоит вопрос производительности, код, интенсивно 
использующий ресурсы процессора, следует выносить за пределы инициализатора 
класса. 




BACK NEXT

Сайт является частным собранием материалов и представляет собой любительский информационно-образовательный ресурс. Вся информация получена из открытых источников. Администрация не претендует на авторство использованных материалов. Все права принадлежат их правообладателям