I wasn't directly involved in writing these classes, but having each
subclass' getAssociatedType() be final seems a bit overzealous to me. If you
want to subclass it (which doesn't seem unreasonable), it seems like you'd
*need* to override this method.
@Ray, John: Do either of you recognize any obvious utility in making this
method final? If not, I think it should be made non-final across all event
types.

On Sat, Aug 8, 2009 at 3:51 PM, jarrod <[email protected]> wrote:

>
> Why is the getAssociatedType() method on ValueChangeEvent considered
> final? I'd like to be able to extend this event, but I can't extend it
> if I can't override getAssociatedType().
>
> Let me explain:
>
> I'm writing a module that is designed to be a base for a slew of other
> "expanded" versions of the module, keeping much of the core
> functionality locked up in a core module and expanding as necessary
> through additional modules.
>
> To be specific, this is a video player module, so some core events
> might be PlayEvent or ValueChangeEvent when the currently playing URL
> changes. Those events should always be generated by the core, but add-
> on modules should be able to respond to those events.
>
> In order to prevent the add-on modules and core components from
> needing to know about each other and adding ***Handlers to all the
> various Has***Handlers in the application, I created a central
> Dispatcher that can register and fire any events - a sort of global
> event bus for all events to come in and get dispatched from.
>
> It works well, but because ValueChangeEvent is generic, I can only
> implement HasValueChangeHandlers for one type on my central
> dispatcher. As it turns out, I need at least two types, and Handlers
> are only interested in one or the other.
>
> To register for the right event, I coded this:
>
>        private static Map<Integer, Object> TYPES = new HashMap<Integer,
> Object>();
>
>        @SuppressWarnings("unchecked")
>        public static <T> Type<ModelHandler<T>> getType(Class<T> clazz) {
>                Integer key = clazz.hashCode();
>                if (!ModelChangeEvent.TYPES.containsKey(key)) {
>                        Type<ModelHandler<T>> type = new
> Type<ModelHandler<T>>();
>                        ModelChangeEvent.TYPES.put(key, type);
>                }
>                return (Type<ModelHandler<T>>)
> ModelChangeEvent.TYPES.get(key);
>        }
>
> So you can register for ValueChangeEvents pertaining to a given class
> type.
>
> However, I need to override getAssociatedType() to do the following:
>
>        @SuppressWarnings("unchecked")
>        @Override
>        public Type<ValueChangeHandler<T>> getAssociatedType() {
>                // TODO: Add null check
>                Integer key = getValue().getClass().hashCode();
>                return (Type<ValueChangeHandler<T>>)
> ModelChangeEvent.TYPES.get
> (key);
>        }
>
>
> So this limits my ability to reuse the ValueChangeHandler on a more
> "global" scope without copy/pasting the class... Unless I am just
> completely distorting the point of the new 1.6 event system...
>
> Help?
> >
>

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to