Альтернатива C # События в Java - PullRequest
14 голосов
/ 07 октября 2009

Я разработчик .Net. Я хочу знать, есть ли какой-либо механизм обработки событий в Java для обработки событий, как C #.

что я хочу сделать, так это то, что я хочу поднять / запустить событие из моего класса при некоторых условиях. и потребитель этого класса должен зарегистрировать это событие и написать метод обработки события.

это легко сделать в C #. Я должен реализовать эту вещь в Java.

после поиска я нашел несколько ссылок, но все они говорят о событиях GUI в AWT и Swing.

может кто-нибудь мне помочь.

Ответы [ 4 ]

26 голосов
/ 07 октября 2009

Хотя большинство примеров будет касаться событий 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 в каждом обработчике по очереди.

Вы можете думать, что типы делегатов в C # очень похожи на интерфейсы с одним методом в Java, а события - это просто пара методов добавления / удаления.

7 голосов
/ 13 октября 2016

Я люблю C # События,

Они просты в использовании и удобны. Я пропустил их в Java, поэтому написал небольшой служебный класс, который имитирует основы C # Event.

  • с использованием Java 8 (для лямбды)
  • нет += оператора, вместо этого позвоните .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 {
}
7 голосов
/ 07 октября 2009

Java имеет поддержку посредством различных реализаций обработки событий - простой Observer / Observable в java.util, PropertyChangeEvent s в java.beans и события GUI, которые наследуются от AWTEvent.

Объект Observable имеет список наблюдателей, которые реализуют интерфейс Observer , и механизмы для добавления и удаления наблюдателей. Если o.notifyObservers(x) вызывается для наблюдаемого, update(o,x) будет вызываться для каждого наблюдателя. Этот механизм несколько старомоден и редко используется в новом коде - он датируется Java 1.0 до того, как EventObject был добавлен в Java 1.1, и улучшена обработка событий для AWT и bean-компонентов.

События Bean и GUI распространяют объект, который расширяет java.util.EventObject на слушателей, которые реализуют подчиненный интерфейс EventListener . Обычно, если вы используете существующий API, вы будете заботиться только о событиях и прослушивателях для этого API, но если вы определяете API, события и прослушиватели должны следовать этому соглашению.

В Java API также принято называть обработчики событий «слушателями», а не обработчиками, и все имена интерфейсов слушателей заканчиваются на Listener. Имена методов не начинаются с «вкл», но должны быть в прошедшем времени - mouseMoved или handshakeCompleted, а не onMouseMove или handleMouseMove.

Класс PropertyChangeSupport обеспечивает реализацию механизма добавления и удаления прослушивателей из bean-компонента, а также используется для свойств виджетов Swing.

Если вы пишете свою собственную обработку слушателя, то обычно слушатели могут удалить себя, вызывая source.removeXXXListener(this) из своего метода обработки событий. В этих случаях простое итерирование простой коллекции слушателей и вызов их методов обработки даст ConcurrentModificationException с - вам нужно скопировать коллекцию слушателей или использовать одновременно изменяемую коллекцию.

1 голос
/ 07 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...