Я реалізував підтримку зворотного дзвінка / делегата в Java за допомогою відображення. Деталі та робоче джерело доступні на моєму веб-сайті .
Як це працює
У нас є принцип класу з назвою Callback з вкладеним класом на ім'я WithParms. API, який потребує зворотного виклику, буде приймати об'єкт зворотного виклику як параметр і, якщо необхідно, створить Callback.WithParms як змінну методу. Оскільки велика кількість застосувань цього об’єкта буде рекурсивною, це працює дуже чисто.
Оскільки ефективність як і раніше залишається для мене високим пріоритетом, я не хотів вимагати, щоб я створював масив об'єктів, що викидає, щоб утримувати параметри для кожного виклику - адже у великій структурі даних може бути тисячі елементів і в обробці повідомлень сценарій ми могли б закінчити обробку тисяч структур даних в секунду.
Для того, щоб бути безпечним у потоці, масив параметрів повинен існувати унікально для кожного виклику методу API, а для ефективності той самий повинен використовуватися для кожного виклику зворотного виклику; Мені знадобився другий об'єкт, який було б дешево створити, щоб зв’язати зворотний виклик з масивом параметрів для виклику. Але, в деяких сценаріях, у виклику вже був би масив параметрів з інших причин. З цих двох причин масив параметрів не належав до об'єкта Callback. Також вибір виклику (передаючи параметри як масив або як окремі об'єкти) належить до рук API, використовуючи зворотний виклик, що дозволяє йому використовувати той виклик, який найкраще підходить для його внутрішньої роботи.
Потім вкладений клас WithParms є необов'язковим і виконує дві цілі, він містить масив об'єкта параметрів, необхідний для викликів зворотного виклику, і він пропонує 10 перевантажених методів виклику () (з 1 до 10 параметрів), які завантажують масив параметрів, а потім викликати ціль зворотного дзвінка.