Альтернатива событий С# в Java
Я разработчик .Net. Я хочу знать, что есть механизм обработки событий в Java для обработки событий, например С#.
что я хочу сделать, это то, что я хочу поднять/запустить форму события моего класса при некотором условии. и потребитель этого класса должен зарегистрировать это событие и метод обработки событий записи.
это легко можно сделать в С#. Я должен реализовать эту вещь в Java.
после выхода в Google я нашел некоторые ссылки, но все это говорит о событиях GUI в AWT и качелях.
может кто-нибудь помочь мне.
Ответы
Ответ 1
Хотя большинство примеров будут связаны с событиями GUI, принципы в основном одинаковы. В основном вы хотите, чтобы интерфейс или абстрактный класс представляли обработчик для события, например.
public interface EventHandler
{
// Change signature as appropriate of course
void handleEvent(Object sender, EventArgs e);
}
тогда издатель события:
public void addEventHandler(EventHandler handler)
public void removeEventHandler(EventHandler handler)
Он либо сохранит список самих обработчиков событий, либо, возможно, их инкапсулирует в тип многократного использования. Затем, когда событие происходит, вы просто вызываете handleEvent
в каждом обработчике по очереди.
Вы можете думать о том, что типы делегатов в С# очень похожи на однопоточные интерфейсы в Java, а события - это просто пара методов добавления/удаления.
Ответ 2
Java имеет поддержку через различные реализации обработки событий - простой Observer/Observable в java.util, PropertyChangeEvent в java.beans, и GUI-события, которые наследуются от AWTEvent.
Объект Observable имеет список наблюдателей, которые реализуют Observer, а также механизмы для добавления и удаления наблюдателей. Если на наблюдаемом вызывается o.notifyObservers(x)
, на каждом наблюдателе будет вызываться update(o,x)
. Этот механизм несколько старомодный и редко используется в новом коде - он датируется Java 1.0 до того, как EventObject был добавлен в Java 1.1 и улучшена обработка событий для AWT и beans.
Beans и события GUI распространяют объект, который расширяет java.util.EventObject слушателям, которые реализуют под-интерфейс EventListener. Обычно, если вы используете существующий API, вам понадобятся только события и слушатели для этого API, но если вы определяете API, события и слушатели должны следовать этому соглашению.
Это также соглашение в Java API для вызова обработчиков событий "слушателей", а не обработчиков, а все имена интерфейсов слушателя заканчиваются на Listener
. Имена методов не начинаются с 'on', а должны быть прошедшим временем - mouseMoved
или handshakeCompleted
, а не onMouseMove
или handleMouseMove
.
Класс PropertyChangeSupport обеспечивает реализацию механизма добавления и удаления прослушивателей из bean, а также используется для свойства виджета Swing.
Если вы пишете свою собственную обработку прослушивателя, обычно разрешайте слушателям удалять себя, вызывая source.removeXXXListener(this)
из своего метода обработки событий. Просто повторение простой коллекции слушателей и вызов их методов обработки даст в этом случае ConcurrentModificationException
- вам нужно скопировать коллекцию слушателей или использовать одновременно изменяемую коллекцию.
Ответ 3
Мне нравится С# Events,
Они просты в использовании и удобны. Я пропустил их в java, поэтому написал небольшой класс утилиты, который имитирует самые основы С# Event
.
- с использованием java 8 (для lambdas)
- no
+=
, вместо этого вызовите .addListener((x) -> ...)
- чтобы вызвать событие, вызовите
.broadcast(<EventArgs insance>)
Онлайн-демонстрация - https://repl.it/DvEo/2
Event.java
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
public class Event {
private Set<Consumer<EventArgs>> listeners = new HashSet();
public void addListener(Consumer<EventArgs> listener) {
listeners.add(listener);
}
public void broadcast(EventArgs args) {
listeners.forEach(x -> x.accept(args));
}
}
- Вы можете хотеть
com.google.common.collect.Sets.newConcurrentHashSet()
для безопасности потока
EventArgs.java
public class EventArgs {
}
Ответ 4
Отметьте этот учебник. Он проходит через некоторые элементы обработки событий Swing, которые вы встретили в своих поисках, но концепции довольно общие. Проще говоря, обработчики событий поддерживают коллекцию слушателей (реализуют интерфейс) и перебирают их, когда они запускают событие, вызывая метод в интерфейсе.