Java: Статті Обробка подій за допомогою анонімних внутрішніх класів
При розробці графічного інтерфейсу користувача (GUI) в Java багато роботи йде на настройку обробників подій для кожного компонента, події якого ви бажаєте відстежити. Зазвичай це включає в реалізацію класу один або кілька обробників подій і перевантаження необхідних методів цих компонентів.
Якщо у вас багато компонентів, то управління цими обработчиками подій часто стає великим головним болем. Наприклад, розглянемо Java аплет, який має кілька кнопок, кожна з яких при натисканні виконує унікальну задачу. Для кожної кнопки ми повинні призначити ActionListener, щоб обробити клацання миші користувача, і перевантажити метод actionPerformed.
При наявності в нашому класі програми реалізації ActionListener і перевантаження методу actionPerformed ми обробляємо всі події кнопки в межах нашого аплету. На жаль, так як кожна кнопка відстежується тим же самим ActionListener, наш actionPerformed метод повинен виконувати кілька порівнянь, щоб визначити, яка кнопка була натиснута. Зазвичай це виконується гидким switch або інструкцією if / else, як показано нижче, і це дійсно не дуже хороший об'єктно-орієнтований підхід.
Інший підхід полягає в тому, щоб створити для кожного компонента окремий клас, єдина мета якого полягає в тому, щоб обробити події цього компонента. Цей підхід краще в тому, що він більш об'єктно-орієнтований, проте створює цілу в'язку нових файлів класу, за якими ви повинні стежити. До того ж, обробляючи події в окремому класі ви втрачаєте доступ до будь-яких полях аплету. Крім того використання цього підходу також збільшує кількість HTTP запитів, які повинен виконати броузер, щоб завантажити аплет.
Так що ж нам робити? Ось, якщо б ми могли формувати всю обробку подій в межах нашого класу додатка без того, щоб жертвувати об'єктно-орієнтованим підходом. Ми можемо робити це за допомогою анонімних внутрішніх класів.
Анонімні класи - класи без імені, що утворюються не тільки конструктором, а й безпосередньо визначенням класу. Якщо ви ніколи не використовували анонімні класи перш, тоді синтаксис може здатися вам трохи незграбним.
Кожен компонент тепер має свій власний actionListener, тут немає шкідливих інструкцій if / else. У самому верху вся обробка подій централізована в межах окремого класу, що робить цей клас набагато простіше для управління. У разі додавання до цього класу нового компонента, події якого треба обробляти, просто потрібно створити новий анонімний обробник подій.
В якості примітки: JBuilder - одна з небагатьох інтегрованих середовищ розробки, яка за замовчуванням використовує анонімні внутрішні класи при визначенні обробників подій. Наприклад при використанні проектувальника GUI, якщо ви зробите подвійне клацання на компоненті Кнопка, то автоматично згенерує код для анонімного внутрішнього класу, який діє як обробник подій цього компонента.
Warning. mysql_connect () [function.mysql-connect]: Can not connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 11
Warning. mysql_db_query () [function.mysql-db-query]: Can not connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 19
Warning. mysql_db_query () [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/books/show2b.php on line 19
Warning. mysql_fetch_array (): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/books/show2b.php on line 30
Дізнайся про що ти насправді зараз думаєш тут.
[An error occurred while processing this directive]
Warning. mysql_connect () [function.mysql-connect]: Can not connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 91
Warning. mysql_db_query () [function.mysql-db-query]: Can not connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 93
Warning. mysql_db_query () [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/news/worldnews.php on line 93
Warning. mysql_fetch_array (): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/news/worldnews.php on line 95