Java эквивалент Какао NSNotification? - PullRequest
5 голосов
/ 28 января 2009

Я пишу Java-приложение, используя виджеты SWT. Я хотел бы обновить состояние определенных виджетов при наступлении определенного события (например, обновление состояния модели данных).

Есть ли в Java что-то похожее на NSNotificationCenter в Какао, где я могу зарегистрировать объект для прослушивания событий уведомлений и ответа на них, а также чтобы другие объекты "запускали" уведомление?

Ответы [ 7 ]

8 голосов
/ 31 января 2009

Хорошо, предположим, что, например, вы хотите, чтобы части вашей программы уведомлялись, когда ваш Loader запускает сканирование и когда он заканчивает сканирование (не беспокойтесь о том, что такое Loader или что такое сканирование, эти примеры из некоторого кода, который я лежал с моей последней работы). Вы определяете интерфейс, называете его «ScanListener», например

public interface ScanListener
{
  public void scanStarted();
  public void scanCompleted();
}

Теперь Loader определяет метод для вашего другого кода для регистрации обратных вызовов, например

public void addScanListener(ScanListener listener)
{
  listeners.add(listener);
}

Загрузчик при запуске сканирования выполняет следующий код

for (ScanListener listener : listeners)
{
  listener.scanStarted();
}

и когда он заканчивается, он делает то же самое с listener.scanCompleted ();

Код, который необходимо уведомлять об этих событиях, реализует этот интерфейс (либо сами, либо во внутреннем классе) и вызывает «loader.addScanListener (this)». Его методы scanStarted () и scanCompleted () вызываются в соответствующее время. Вы даже можете сделать это с помощью обратных вызовов, которые принимают аргументы и / или возвращают результаты. Это все зависит от вас.

2 голосов
/ 31 января 2009

Не существует предварительно существующей службы для процесса, которая отправляет события в java, что эквивалентно NSNotificationCenter по умолчанию. В Java тип события определяется объектом события, являющимся конкретным типом (что также означает, что метод уведомления зависит от этого типа), а не с использованием строки. До обобщений написание общего диспетчера и получателя событий, который также является безопасным с точки зрения типов, на самом деле невозможно (засвидетельствование распространения классов * Event и интерфейсов * EventListener в библиотеках AWT и Spring).

Есть несколько средств для отправки событий. Как упомянул Пол , есть java.util.Observable, который, как вы указываете, требует подклассов. Также есть java.beans.PropertyChangeSupport, что может быть полезно в зависимости от вашей ситуации.

Вы также можете написать его самостоятельно. Источник для PropertyChangeSupport, скорее всего, доступен в openjdk, и вы можете посмотреть на заброшенный Apache Commons Event проект. В зависимости от ваших потребностей, вам, возможно, придется беспокоиться о таких вещах, как многопоточность, разделение, утечки памяти (обеспечение отмены регистрации или использование слабых ссылок) и одновременное изменение (переберите копию вашего списка слушателей, так как слушатель может решить отменить регистрацию самого себя в ответ на изменение).

Теперь, когда в Java существуют дженерики, станет возможна универсальная библиотека отправки событий; Однако я не сталкивался ни с одним. Кто-нибудь?

2 голосов
/ 28 января 2009

Какие уведомления вы ищете? Если все, что вам нужно, это чтобы один объект мог сказать кому-либо еще: «Эй, я изменился, обновите соответственно», то самый простой способ - использовать существующий интерфейс Observer и класс Observable. Или напишите свой собственный с интерфейсом, который определяет, что вы хотите вызывать у слушателей из того, который был изменен.

1 голос
/ 31 января 2009

На самом деле в Java встроено средство, которое делает именно то, что вы хотите, но это не то, что вы, возможно, рассмотрели, и, честно говоря, оно, вероятно, немного тяжелое для того, что вы хотите.

Тем не менее, он сказал, что он существует.

Это JMX.

Вы создаете MBeans, а затем другие могут регистрироваться на события из этих MBeans. Затем MBean может отправить уведомление.

Лично я бы не стал использовать его для этого случая (я бы просто выбрал свой), но средство есть, и оно хорошо определено и задокументировано.

0 голосов
/ 12 мая 2014


Существует реализация IOS NSNotificationCenter в Java .
Вы можете найти исходный код в: Это проект Github

0 голосов
/ 30 января 2012

В Java это будет провайдер, запускающий уведомления для своих слушателей. Но Java не предлагает слабой связи, которую вы получаете с NSNotification от Cocoa, потому что в поставщиках Java и подписчиках должны быть ссылки друг на друга. Сравните с этой главой 18 в «Изучение Objective-C для разработчиков Java».

0 голосов
/ 31 января 2009

Не Java, но проект IPython имеет центр уведомлений, написанный на Python здесь , который можно использовать в качестве шаблона для версии Java.

...