Есть ли в Java встроенная поддержка событий, аналогичная C#?

Я немного сбит с толку из-за того, что слышал, что Java не делает события.

Но я знаю, что это делает события GUI.

Я что-то пропустил? Есть ли в Java механизм обработки событий?

Я знаю, что могу реализовать шаблон подписчика издателя, но я ищу нативную поддержку в Java.

Кажется, я что-то помню о событиях Java Adding в Java 5 или 6, но я не могу вспомнить, где я это услышал, и, возможно, я это придумывал.

По сути, я оборачиваю устройство в класс java, который генерирует события, и ищу наиболее логичный способ разоблачения этого. Я пришел в основном из.Net Background, и я ищу что-то вроде событий в.Net (C#)

Любая помощь будет оценена.

10 ответов

Решение

Как вы уже сказали, вы можете сделать то же самое с шаблоном издатель-подписчик / наблюдатель. Это просто требует немного больше работы.

И нет, в Java нет встроенной поддержки событий, как в C# для делегатов.

Предложенный другими здесь механизм подписки / публикации позволит вам реализовать синхронные события. Для асинхронных циклов событий (запустить и забыть) Вы можете посмотреть на "актеров". Actor<A> состоит из обработчика для сообщений (событий) типа A, а также стратегии потоков для выполнения обработчика. Это позволяет вам выполнять одновременную асинхронную обработку событий, как показано ниже:

public class EventExample {
  public static void main(String[] args) {
    while ((char c = System.in.read()) >= 0) {
      eventHandler.act(c);
    }
  }

  public static Actor<Character> eventHandler =
    Actor.actor(Strategy.simpleThreadStrategy(), new Effect<Character>() {
      public void e(Character c) {
        // Do something with c here.
      }
    });
}

Получить библиотеку актеров здесь. Смотрите Javadoc здесь.

Из того, что я помню о Java (не работал с ним> 6 месяцев), я не думаю, что есть события аля.NET. Лучше всего будет использовать шаблон издателя / подписчика. Это довольно легко реализовать и довольно надежно.

В Java нет встроенной поддержки - вам придется реализовать шаблон наблюдателя (он же Subscribee/Publish). Это довольно просто - не более десятка строк кода.

java.util.Наблюдаемый @since JDK1.0

Swing или AWT, которые являются наборами инструментов Java UI, оба обрабатывают события - посмотрите официальное руководство по событиям Swing для примеров. Вам, конечно, нужно будет написать свой пользовательский интерфейс на Swing, чтобы иметь возможность регистрировать слушателей этих событий.

Я не разбираюсь в C#, но Java Beans, которые не являются компонентами пользовательского интерфейса, может, конечно, уведомлять слушателей об изменениях состояния с помощью Events:

http://java.sun.com/developer/onlineTraining/Beans/beans02/

Это было частью спецификации Java Beans с момента ее появления. Обратите внимание на дату в учебнике: это винтаж 2000 года.

Источник и слушатель должны работать в одной и той же JVM. Вам нужно будет использовать прокси для связи с чем-то, работающим в другой JVM, но это можно сделать.

Я гуглил учебник по событиям C# и нашел это. Регистрация слушателей в Java и запуск событий, изменяющих свойства, напоминали то, что я видел, когда просматривал учебник по C#. Я что-то упустил? (Я признаю, что я не читал глубоко - сейчас нет времени.)

Возможно, вы также захотите взглянуть на библиотеку EventBus с открытым исходным кодом, которая, в отличие от стандартного шаблона издатель / подписчик, использует класс-посредник (шину событий), чтобы уменьшить жесткую связь, необходимую в шаблоне издатель / подписчик (где подписчики Необходимо знать обо всех издателях, чтобы зарегистрироваться на них, что не всегда возможно и зачастую громоздко).

Я использовал его в приложениях с графическим интерфейсом, но он может иметь дело с любыми видами событий.

Вам нужны темы. Графический интерфейс в Java имеет события, потому что есть специальный поток для событий пользовательского интерфейса для отправки. Есть также что-то, называемое Observer и Observable (это нейтральная по вкусу версия слушателей событий из GUI), но это просто шаблон дизайна...

Другие вопросы по тегам