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