Sobes.tech
Назад к вопросам
Junior — Middle
84

Какими методами можно реализовать вызов callback-функции в Java Bean?

Компании, где спрашивали
СБЕР Бизнес

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Callback в Java Bean обычно реализуют через передачу объекта-слушателя в bean и последующий вызов его метода изнутри bean. Чаще всего для этого используют интерфейсы, listener-паттерн, а в современных вариантах — Consumer/Runnable или события через PropertyChangeListener. Главное — показать, что bean не “знает” конкретную реализацию, а вызывает заранее согласованный контракт.

Определение:

Callback — это механизм, при котором один объект сохраняет ссылку на другой объект или его функциональный интерфейс и позже вызывает его метод в ответ на событие или завершение операции. В Java Bean это обычно делается через регистрацию слушателя: bean хранит подписанный callback и вызывает его, когда нужно сообщить о событии. Такой подход снижает связанность между компонентами.

Пример использования:

Например, bean выполняет длительную загрузку данных и уведомляет внешний код о завершении через callback.

import java.util.function.Consumer;

public class DataLoaderBean {
    private Consumer<String> onComplete;

    public void setOnComplete(Consumer<String> onComplete) {
        this.onComplete = onComplete;
    }

    public void load() {
        // имитация работы
        String result = "Данные загружены";

        if (onComplete != null) {
            onComplete.accept(result);
        }
    }
}

class Demo {
    public static void main(String[] args) {
        DataLoaderBean bean = new DataLoaderBean();

        bean.setOnComplete(message -> System.out.println("Callback: " + message));

        bean.load();
    }
}

Пояснение кода:

  1. DataLoaderBean хранит ссылку на callback в поле onComplete.
  2. Метод setOnComplete(...) позволяет зарегистрировать обработчик извне.
  3. Метод load() выполняет некоторую работу и формирует результат.
  4. После завершения bean проверяет, что callback задан, и вызывает onComplete.accept(result).
  5. В main callback задается лямбдой, которая печатает сообщение в консоль.

Если рассматривать классический Java Bean-подход, то вместо Consumer часто используют свой интерфейс слушателя и методы addXListener/removeXListener, а внутри bean — вызов метода интерфейса у всех зарегистрированных слушателей.

Ключевые моменты:

  • Самый распространенный способ — передать в bean callback через интерфейс или функциональный интерфейс.
  • Для Java Bean-подобной модели типичный вариант — паттерн listener с add...Listener и remove...Listener.
  • Consumer, Runnable, Callable удобно использовать, когда нужен простой callback без сложной модели событий.
  • Для уведомления об изменениях свойств часто применяют PropertyChangeListener.
  • Важно хранить callback как зависимость и вызывать его в нужный момент, не привязываясь к конкретной реализации.
  • Если callback может быть не задан, нужна проверка на null перед вызовом.