Використання анонімних класів – JAVA ДЛЯ ANDROID

&nbsp

Фахівці, які мають досвід розробки користувальницьких інтерфейсів, знайомі з концепцією зворотного виклику (callback): код повинен отримати повідомлення, коли в інтерфейсі станеться якесь зміна Приклади таких змін – натискання кнопки або перехід моделі в якийсь новий стан Може бути, з мережі прийшли нові дані і їх потрібно відобразити Вам знадобиться спосіб додавання під фреймворк блоку коду, який згодом буде виконуватися на вашу вимогу

Хоча в мові Java і присутній ідіома для передачі блоків коду, вона трохи незручна, бо ані блоки коду, ні методи, не є в мові обєктами першого класу У мові не передбачений спосіб отримання посилання ні на першому, ні на другому

Посилання може вказувати на екземпляр класу Наприклад, в Java можна передавати не блоки або функції, а цілий клас, який визначає потрібний вам код в якості одного з своїх методів Сервіс, що надає API зворотного виклику, визначить його протокол за допомогою інтерфейсу Клієнт сервісу визначає реалізацію цього інтерфейсу і передає інформацію під фреймворк

Розглянемо, наприклад, як в Android реалізується механізм відгуку на натиснення клавіші користувачем Клас Android View визначає інтерфейс OnKeyListener, який, у свою чергу, визначає метод опКеу Якщо код передає View реалізацію OnKeyListener, то метод опКеу буде викликатися всякий раз, коли клас View буде обробляти нову подію, повязане з натисканням клавіш

Код може мати наступний вигляд:

При створенні нового екземпляра класу MyDataModel за допомогою аргументу view конструктору повідомляється, до якого виду прикріплюється цей клас Конструктор створює новий екземпляр тривіального класу зворотного виклику, KeyHandler, і встановлює його в вид Усі наступні події, повязані з клавішами, передаватимуться методу handleKey, який відноситься до примірника моделі

Поставлена ​​задача, таким чином, безумовно, вирішується, однак рішення може вийти досить негарним, особливо якщо класу доведеться обробляти різнохарактерні події, що надходять від різноманітних видів Через якийсь час всі ці визначення типів абсолютно засмітять програму Визначення може бути розташоване досить далеко від використання елемента, а якщо задуматися – навіщо ці визначення взагалі потрібні

У Java такий код можна дещо спростити, скориставшись анонімним класом Ось фрагмент коду, подібний показаному вище Але він реалізується із застосуванням анонімного класу:

Звичайно, на синтаксичний розбір такого коду може знадобитися деякий час, але він практично ідентичний коду з попереднього прикладу Він передає новоспечений примірник підтипу ViewOnKeyListener як аргумент, це робиться при виклику viewsetOnKeyListener Але в даному випадку аргумент до виклику view setOnKeyListener використовує особливий синтаксис, що визначає новий підклас інтерфейсу ViewOnKeyListener і інстанцірует його за одну операцію Новий екземпляр – це екземпляр класу без імені, тобто анонімного класу Його визначення існує тільки в інстанцірует його затвердження

Анонімні класи дуже зручні і використовуються в Java в якості ідіоми для вираження багатьох різновидів блоків коду Обєкти, створювані із застосуванням анонімних класів, є в мові обєктами «першого класу »і допустимі всюди, де міг би використовуватися обєкт того ж типу Наприклад, можливо таке присвоєння:

Може виникнути питання: чому анонімний клас в цьому прикладі делегує свою фактичну реалізацію (метод handl еКеу) осяжний класу Насправді не існує правила, яке б якось регламентувало вміст анонімного класу: він цілком може містити й повну реалізацію З іншого боку, добре розуміння ідіом підказує, що код, що змінює стан обєкта, слід помістити в клас обєкта Якщо реалізація міститься в осяжний класі, її можуть використовувати інші методи і зворотні виклики Анонімний клас – просто посередник, в цьому і полягає його функція

У Java дійсно присутні по-справжньому суворі обмеження, що стосуються використання в анонімному класі змінних, які знаходяться в області видимості (тобто всього, що визначено у вищестоящому блоці) Зокрема, анонімний клас може посилатися на змінну, успадковану з навколишнього області видимості, лише в тому випадку, якщо ця змінна оголошена як final Наприклад, скомпілювати наступний фрагмент коду не вдасться:

Проблема знімається, якщо оголосити аргумент до curry як final Коли ми оголошуємо його як final, це, звичайно ж, означає, що його не можна змінити в анонімному класі Але для подолання цієї проблеми є простий ідіоматичний спосіб:

Джерело: Android Програмування на Java для нового покоління мобільних пристроїв

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*