Я думаю, что Java столкнулась с той же проблемой некоторое время назад, и решением было использование событий PropertyChange. Они приходят с
- PropertyEvent, который содержит источник, имя свойства и старые + новые значения
- PropertyChangeListener
- PropertyChangeSupport, которому вы можете делегировать запуск события, а также регистрацию и отмену регистрации слушателей.
Вы теряете немного специфичности (события соответствуют их имени в виде строки), но вы все равно можете запускать мелкозернистые события и иметь некоторую поддержку внешних классов.
Я не использовал это широко в GWT, поэтому я не могу комментировать аспекты эффективности.