If I recall correctly (I believe I may be partially responsible), the StringMap type was introduced as a factor of common functionality in the Exchange and Message types; these types (and their associated impls) had identical get(Class<T>) and put(Class<T>, T) operations, and it just made sense to pull these out into a common base type. So not to sound too defensive, but this behavior has probably been in the Exchange and Message all along.

\end{disclaimer}

But to get to your real question, which I take to be, "Should we remove the String -> Object restriction on the map type?", my only question is, are there any cases in which there could be two Class instances that represent the same type? I.e., given the fact that you can have multiple class loaders, Foo.class is not necessarily a singleton, right? If so, then exchange.remove(Foo.class) may be idempotent on exchange.[1] I'm guessing here, and I guess I was assuming all along that that was the real reason that types were being keyed off their names, as opposed to themselves, directly. But I was not involved in the start of the Message and Exchange types, so I don't know if this was a use-case envisioned in the initial design. (If not, I don't see any reason not to remove the restriction, as you propose)

-Fred

[1] Class inherits equals and hashCode from Object.

On Apr 11, 2007, at 11:52 AM, Glynn, Eoghan wrote:

But I wonder why Exchange even implements
org.apache.cxf.message.StringMap, when clearly we're using it to set
non-string properties, i.e. those keyed on Class. Maybe instead Exchange
should revert to just implement java.util.Map directly?

Or have Exchange implement a generic Map sub-interface with T
get(Class<T> key) and void put(Class<T> key, T value) overrides (to
avoid having to cast the exchange.get(MyClass.class) return value), but
without the <String, Object> restriction?

Reply via email to