Much of the code for getting all the superclasses and superinterfaces of a
class is coded in the upcoming [lang] reflection code. Maybe the next
collections release should depend on [lang]?
Stephen
----- Original Message -----
From: "Michael A. Smith" <[EMAIL PROTECTED]>
To: "Jakarta Commons Developers List" <[EMAIL PROTECTED]>
Sent: Wednesday, October 23, 2002 5:13 AM
Subject: Re: cvs commit:
jakarta-commons/collections/src/java/org/apache/commons/collections
ClassMap.java
> [EMAIL PROTECTED] wrote:
> > bayard 2002/10/22 20:35:23
> >
> > Added: collections/src/test/org/apache/commons/collections
> > TestClassMap.java
> > collections/src/java/org/apache/commons/collections
> > ClassMap.java
> > Log:
> > Uses inheritence in the get() value lookup to decide which value to
return.
> > I find this very useful when implementing registries of which Class
acts
> > upon which value. So in a ConvertUtils class, a ClassMap would handle
the
> > many Converters, deciding which Converter to use on which value.
> > 1.1
jakarta-commons/collections/src/java/org/apache/commons/collections/ClassMap
.java
> >
> > Index: ClassMap.java
>
> [snip]
>
> ClassMap looks like it needs more documentation describing the selection
> process if more than one superclass/interface matches the requested
> class passed to get. More specifically...
>
> > public Object get(Object key) {
> > if(key == null) {
> > return null;
> > }
> > Class clss = null;
> >
> > if(key instanceof Class) {
> > clss = (Class)key;
> > } else {
> > clss = key.getClass();
> > }
> >
> > Object obj = super.get(clss);
> >
> > if(obj == null) {
> >
> > // if this is null, let's go up the inheritence tree
> > obj = getInterfaces(clss);
>
> ... should document that interfaces have a higher priority for matching
> than superclasses.
>
> > if(obj == null) {
> > obj = getSuperclass(clss);
> > }
> > }
> >
> > return obj;
> > }
> >
> > private Object getInterfaces(Class clss) {
> > if(clss == null) {
> > return null;
> > }
> > Object obj = null;
> > Class[] interfaces = clss.getInterfaces();
> > for(int i=0; i<interfaces.length; i++) {
> > obj = (Object)super.get(interfaces[i]);
>
> ... and that the interfaces are checked in the order in which they are
> declared in the "implements" clause of the class.
>
> > if(obj != null) {
> > return obj;
> > }
>
> ... and that interfaces that implement other interfaces for a declared
> interface are checked before the next declared interface.
>
> > obj = getInterfaces(interfaces[i]);
> > if(obj != null) {
> > return obj;
> > }
>
> .. followed by super interfaces to a declared interface
>
> > obj = getSuperclass(interfaces[i]);
> > if(obj != null) {
> > return obj;
> > }
> > }
> > return null;
> > }
>
> in other words, the semantics of the interface selection stuff is pretty
> unclear without looking at the code, and even then, can be a bit
confusing.
>
> > private Object getSuperclass(Class clss) {
> > if(clss == null) {
> > return null;
> > }
> > Object obj = null;
> > Class superclass = clss.getSuperclass();
> > obj = (Object)super.get(superclass);
> > if(obj != null) {
> > return obj;
> > }
> > obj = getInterfaces(superclass);
>
> especially when you add in the interfaces of super classse
>
> > if(obj != null) {
> > return obj;
> >
> > obj = getSuperclass(superclass);
>
> and super-super classes.
>
> > if(obj != null) {
> > return obj;
> > }
> > return null;
> > }
>
>
> :)
>
> michael
> --
> Michael A. Smith
> [EMAIL PROTECTED]
>
>
>
> --
> To unsubscribe, e-mail:
<mailto:commons-dev-unsubscribe@;jakarta.apache.org>
> For additional commands, e-mail:
<mailto:commons-dev-help@;jakarta.apache.org>
>
--
To unsubscribe, e-mail: <mailto:commons-dev-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@;jakarta.apache.org>