Альтернатива событий С# в 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, которые вы встретили в своих поисках, но концепции довольно общие. Проще говоря, обработчики событий поддерживают коллекцию слушателей (реализуют интерфейс) и перебирают их, когда они запускают событие, вызывая метод в интерфейсе.