Есть ли в 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.
}
});
}
Из того, что я помню о Java (не работал с ним> 6 месяцев), я не думаю, что есть события аля.NET. Лучше всего будет использовать шаблон издателя / подписчика. Это довольно легко реализовать и довольно надежно.
Вот статья на эту тему, также смотрите Какая библиотека / структура модели Actor для Java?
В Java нет встроенной поддержки - вам придется реализовать шаблон наблюдателя (он же Subscribee/Publish). Это довольно просто - не более десятка строк кода.
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), но это просто шаблон дизайна...